当前位置: 首页 > news >正文

深⼊理解指针(3)【数组与指针】

目录

1. 数组名的理解
2. 使⽤指针访问数组
3. ⼀维数组传参的本质
4. 冒泡排序
5. ⼆级指针
6. 指针数组
7. 指针数组模拟⼆维数组

一   数组名的理解

       由上图可知我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址,⽽且是数组⾸元素的地址,以前我们只写数组名是为了方便理解。

    那是不是不管在哪里数组名就是数组⾸元素(第⼀个元素)的地址呢?

          输出的结果是:40,如果arr是数组⾸元素的地址,那输出应该的应该是4/8才对。 其实数组名就是数组⾸元素(第⼀个元素)的地址是对的,但是有两个例外:

       sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩, 单位是字节。
        &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素 的地址是有区别的)
    除此之外,任何地⽅使⽤数组名,数组名都表⽰⾸元素的地址。
 那arr和&arr有啥区别呢?

 

       这⾥我们发现&arr[0]和&arr[0]+1相差4个字节,arr和arr+1 相差4个字节,是因为&arr[0] 和 arr 都是⾸元素的地址,+1就是跳过⼀个元素。
但是&arr 和 &arr+1相差40个字节,这就是因为&arr是数组的地址,+1 操作是跳过整个数组的。

二    使⽤指针访问数组

          将*(p+i)换成p[i]也是能够正常打印的,所以本质上p[i] 是等价于 *(p+i),同理arr[i] 应该等价于 *(arr+i),数组元素的访问在编译器处理的时候,是转换成⾸元素的地址+偏移量求出元素的地址,然后解引⽤来访问。

三    ⼀维数组传参的本质

# include <stdio.h>
void test ( int arr[])
{
      int sz2 = sizeof (arr)/ sizeof (arr[ 0 ]);
      printf ( "sz2 = %d\n" , sz2);
}
int main ()
{
      int arr[ 10 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };
      int sz1 = sizeof (arr)/ sizeof (arr[ 0 ]);
      printf ( "sz1 = %d\n" , sz1);
      test(arr);
return 0 ;
}

void test ( int arr[]) // 参数写成数组形式,本质上还是指针
{
printf ( "%d\n" , sizeof (arr));
}
void test ( int * arr) // 参数写成指针形式
{
printf ( "%d\n" , sizeof (arr));
}

    总结:⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。本质上数组传参传递的是数组⾸元素的地址

四    冒泡排序(后续还会更新更多排序)

核⼼思想: 两两相邻的元素进行比较。
例如;将一个数组排成升序。

五        ⼆级指针 【指针有三级、四级等只是⼆级相对常用】l

1   作用:类比于一级指针的1作用,我们便会想到二级指针的作用是用来存放一级指针变量的地址。

2   对于⼆级指针的运算

int a=10;

int *pa=&a;

int ** ppa=&pa;

*ppa 通过对ppa中的地址进⾏解引⽤,这样找到的是 pa *ppa 其实访问的就是 pa
int b = 20 ;
*ppa = &b;//等价于pa=&b;

 **ppa 先通过 *ppa 找到 pa ,然后对 pa 进⾏解引⽤操作: *pa ,那找到的是 a。

**ppa = 30 ;
//等价于*pa = 30;
//等价于a = 30;

        指针数组

     1定义:指针数组顾名思义就是用来存放指针的数组。指针数组的每个元素都是⽤来存放地址(指针)的。

 

 七     指针数组模拟⼆维数组

1限制:每个数组元素个数一样,不一样最好别用很麻烦。

2实现方式:

用数组的个数来代替行数,只要得到每个数组首元素的地址便可以得到数组存储的数据,而数组中元素的个数用来代表尼斯列数。所以每个数组元素个数一样,不一样最好别用很麻烦。

 本篇文章就到此结束,希望有所能帮到 读者更好的了解指针,后续还会继续更新指针相关识。 


http://www.mrgr.cn/news/68476.html

相关文章:

  • FIPS203 后量子安全ML-KEM(标准简读)
  • 深入理解 Git 及其工具的用途、使用方法与区别
  • 亲和性第1部分 - 亲和性、放置和排序
  • Java基础——反射
  • 计算机网络——路由器构成
  • 牛客网Java高频面试题(2024最新版含答案)
  • js 如何判断是否是双击
  • 三维扫描建模对文博行业有什么影响?
  • 如何使用函数模板和类模板?模板的优点是什么?
  • 自然常数e的发现
  • RocketMQ延迟消息机制
  • 【Android 系统中使用CallStack类来追踪获取和操作调用栈信息】
  • windows server和sqlserver的版本更新
  • 扩展坞映射名称
  • MySQL DATETIME 和 DATE
  • linux基础理解和使用 iptables 防火墙
  • AssertionError: weight model.layers.0.self_attn.q_proj.weight does not exist
  • 十七:Spring Boot (2)-- spring-boot-starter-web 依赖详解
  • godot--自定义边框/选中时样式 StyleBoxTexture
  • 项目管理必备的5款项目管理软件
  • 海南华志亿星电子商务有限公司赋能抖音商家成长
  • 一款绘制3D架构图的在线神器,iCraft Editor
  • redis 原理篇 21 网络模型 IO多路复用 poll
  • 探索呼叫中心的奥秘:从基础到前沿进展
  • redis 原理篇 25 网络模型 信号驱动IO 及 异步IO
  • wordpress搬家迁移后怎么修改数据库用户名