数组和指针的一些问题及理解

首先我们先看这样一组程序
在这里插入图片描述
经过调试之后我们得到以下的结果
在这里插入图片描述
我们先来分析第六行和第七行 看如下程序
在这里插入图片描述
在这里插入图片描述
首先我们可以得知,数组名可以理解为指向一维数组首元素的指针常量,并且&a并不是a的地址,通过用%p来打印a以及&a可以发现 这两个在数值上其实是相等的,这和指针并没有什么关系,而是数组本身内部的属性,此时我们继续打印a+1和&a+1,由于指针类型和int类型都占4个字节,为了大家可以方便理解,这里我将数组元素定义为double型,占八个字节,这里我们可以看到,a+1,偏移了一个double,&a+1偏移了十个double,这里我们可知,a存储首元素地址,&a存储数组的地址,当然,在我们单独打印a在内存中所占字节,还是整个数组的大小,&a仍然是指针的大小.

注意:数组名作为指针是一个常量,不能和变量指针等同
在这里插入图片描述
由于 int*只能指向数组中的单个元素,故第7行编译是不能通过的;在这里插入图片描述
对于8,9行来说int(*p)[n]数组指针,也称为行指针,()的优先级高,p为指向一个整型的一维数组,这个一维数组的长度为n,执行p+1,p要跨过n个整型数据的长度.那么这里第八行赋值符号两边数据类型是不同的,左边是指向整个数组的数组指针,右边是指向单个字符的指针.

=====================这是一条优美的分隔符

接下来我们看一下二维数组
比如我们定义一个二维数组
int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};在物理上可以说是以矩阵的形式存在的:
0 1 2 3
4 5 6 7
8 9 10 11
当然在逻辑上,是在内存中一块连续的内存,占48个字节
int a[3][4]可以看成是长度为3的一维数组,数组内每个元素长度为4;(无论是几维数组,在定义的时候,永远只有第一个[]可以省略,其他不可以省略).
我们定一个指向a的指针变量int(*p)[4]=a; 这里你可能会有这样一个疑惑:
在这里插入图片描述
刚刚我们说了int(*p3)=a;是编译不成功的,因为赋值符号左右两边的数据类型 范围是不相等的,那为什么在我们定义二维数组c,同样的数组指针就可以用在c上呢,原因很简单,一维数组中,数组名表示数组首元素的地址,以此类推在二维数组上,有的朋友会说a表示的是元素a[0][0]的地址,这里一定要注意,这种想法是错误的,前面我们提到二维数组a[3][4]是长度为3的一维数组,每个元素长度为4,所以数组a的第一个元素不是a[0][0],而是a[0]的地址,当然单独打印a[0]在内存中所占长度为16,也就是第0行数据的长度,(这里的a[0]可以看成是一维数组的数组名)一定要分清,这也是为什么我们在进行二维数组取元素的时候需要用到两个 *,

所以对于二维数组建立数组指针时,赋值符号左右两边是相同的;

接下来继续在定义一个指向a的指针变量int( * p)[4]=a之后,这里的4为步长(也就是{0,1,2,3}…),在执行p+1的时候要跨过4个整型数据的长度,即p+1就前进4 * 4个字节,指向二维数组的下一行(a[1]),那么此时我们求*(p+1)(也可以说是a[1])他占内存中的长度 是16,也就是说,单独使用其表示一行的数据,放在表达式中转换为第一行数据首地址,就类同于一维数组的数组名,

*( * (p+1)+1)也可以说是 *(a[1]+1)也就是第一行的的第一个元素值,取地址上的数据.

===================这又是一条优美的分隔符

还记得最开始的代码
在这里插入图片描述
没错 这里我们要说的就是 数组指针和指针数组

数组指针时指针,指针数组是数组
第二行代码代表的是存放十个指向int类型数据的指针,那么他的大小就由数组本身决定
第一行代码指向包含四个int类型数据的数组,在32位的机子上固定占4个字节
这里要说一下[]的优先级高于*,所以我们在写数组指针的时候一定要记得加()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值