对数组指针的理解

一、一维数组

1.先定义一个一维数组

int a[4]={1,2,3,4};

(1)一维数组名a是个地址,地址类型为:int *

(2)一维数组名取地址&a是个地址,地址类型同:int (*p)[4], 也即&a指向含4个int元素的一维数组  此时&a类型即为一个数组指针

2.数组名是数组首元素的首地址

   a的值和&a[0]的值相同     但    意义不同

3.意义不同在哪里

先实现一串代码

#include <stdio.h>
#include <stdlib.h>
int main() {
	int a[3] = { 0 };
	printf("a   =%d\n", a );
	printf("a+1 =%d\n", a + 1);
	printf("&a+1=%d\n", &a + 1);
	system("pause");
	return 0;
}

运行结果:

“+1”就是偏移量问题:一个类型为T的指针的移动,是以sizeof(T)为移动单位

a+1:在数组首元素的首地址的基础上,偏移一个sizeof(a[0])单位。此处的类型T就是数组中的一个int型的首元素。

 &a+1:在数组的首地址的基础上,偏移一个sizeof(a)单位。此处的类型T就是数组中的一个含有3个int型元素的数组

4.a[0]和&a[0]

#include <stdio.h>
#include <stdlib.h>
int main() {
	int a[3] = { 0 };
	printf("a       =%d\n", a);
	printf("a+1     =%d\n", a + 1);
	printf("&a[0]+1 =%d\n", &a[0] + 1);
	printf("&a+1    =%d\n", &a + 1);
	printf("a[0]+1  =%d\n", a[0] + 1);
	system("pause");
	return 0;
}

运行结果:

可以看到&a[0]+1的值其实和a+1的值是相同的

而a[0]+1其实就是0+1=1

二、二维数组

1.定义一个二维数组

int b[3][4]={0};

此时二维数组可以看成是有3个成员的一维数组,每个一维数组有4个元素

2.解释

   (1)b[0]是个一维数组名,也是个地址,地址类型为:int *

(2)&b[0]是个地址,地址类型同:int (*p)[4], 也即&b[0]指向含4个int元素的一维数组

更进一步:

(3)b是个地址,地址类型同:int (*p)[4],也即b指向含4个int元素的一维数组

(4)&b是个地址,地址类型同:int (*p)[3][4],也即&b指向含3x4个int元素的2维数组

    *注意:尤其注意上面的(3),这条结论指出了:二维数组名实际上是一维数组的地址!

验证:

#include <stdio.h>
#include <stdlib.h>
int main() {
	int b[3][4] = { 0 };
	printf("b   =%d\n", b );
	printf("b+1 =%d\n", b + 1);
	printf("&b+1=%d\n", &b + 1);
	system("pause");
	return 0;
}

运行结果:

同上述一维数组a+1  &a+1 

3.其他

#include <stdio.h>
#include <stdlib.h>
int main() {
	int b[3][4] = { 0 };
	printf("b           =%d\n", b);
	printf("b+1         =%d\n", b + 1);
	printf("&b[0]+1     =%d\n", &b[0] + 1);
	printf("&b+1        =%d\n", &b + 1);
	printf("b[0]+1      =%d\n", b[0] + 1);
	printf("&b[0][0]+1  =%d\n", &b[0][0] + 1);
	system("pause");
	return 0;
}

运行结果:

b[0]+1就相当于一维数组中的a+1 只是偏移一个元素

&b[0][0]即相当于一维数组中&a[0]

三、总结

1.数组名,是指向它的第一个一级成员的指针

2. 数组名取地址,是指向整个数组的指针

//所谓一级成员,举个例子,int a[5],那么数组a的一级成员就是int型变量;int b[10][5],数组b的一级成员是int [5]的一维数组

3.数组名是数组首元素的首地址

--------------------- 

部分参考:
原文:https://blog.csdn.net/qq_31073871/article/details/80800858 
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值