C语言——数组,指针,指针数组,数组指针

零、存储单元和地址

计算机在保存数据时,把数据放在一个个存储单元中,存储单元可以理解为一个个小房间。

地址就是存储单元(小房间)的房间号,且这个房间号是唯一的。

详细请学习计算机组成原理3.1

一、变量a

cpp 复制代码
	int a=5;
    //输出a的值
	printf("a=%d\n", a);
    //输出a的地址
	printf("a=%p\n", &a);

发现:a的值是5,a的地址后四位F314。

理解:这里就是把5放进了一个名字叫a的存储单元(小房间),这个存储单元的房间号是F314。

二、指针b

cpp 复制代码
//指针b指向a
int* b = &a;
//指针b的值
printf("b=%p\n", b);
//指针b的地址
printf("b=%p\n", &b);

1.发现:b的值和a的地址相同都是F314,b的地址是F338

2.那么计算机是如何通过b的地址访问到a的值呢?

首先,计算机通过b的地址(F338)找到b保存的内容(F314)。

然后,因为b的内容是a的地址,通过a的地址(F314)访问a的内容(5)。

3.&和*:b=&a就是b存储单元指向了a存储单元。*b就是通过b存储单元保存的内容找到a存储单元的内容

cpp 复制代码
	//通过b访问a
	printf("a=%d\n", *b);

三、数组c

cpp 复制代码
int c[3] = { 1,2,3 };
//打印c的值
for (int i = 0; i < 3; i++) {
	printf("c[%d]=%d ",i, c[i]);
}
printf("\n");
//打印c的地址
printf("c=%p\n", c);
//打印c中各个元素的地址
for (int i = 0; i < 3; i++) {
	printf("c[%d]=%p ", i, &c[i]);
}

发现:c的值是1,2,3

c的地址是F358

c[0]的地址是F358,c[1]的地址是F35C,c[2]的地址是F360

结论一:c的地址和c[0]的地址一样,所以数组返回的是一个地址且是该数组的首地址。

结论二:c[0]和c[1]的地址相差4B,也就是32位,刚好是一个int

四、指针数组d

cpp 复制代码
int* d[3];
//c的各个元素的地址给d
for (int i = 0; i < 3; i++) {
	d[i] = &(c[i]);
}
//打印d的值
for (int i = 0; i < 3; i++) {
	printf("d[%d]=%p ",i, d[i]);
}
printf("\n");
//打印d的地址
for (int i = 0; i < 3; i++) {
	printf("d[%d]=%p ",i, &(d[i]));
}

发现:d的值和c的地址一样,d的地址相差8B

重点一:指针数组的定义int *d[3]。因为[]的优先级高于*,所以这是一个数组,数组名是d,数组元素是int *(整型数据的地址),数组长度是3。

重点二:因为指针数组d保存的地址,我们让d的各元素对应c的各元素的地址,所以d的值和c的地址对应(F358,F35C,F360)。

重点三:d的地址分别是F3C8,F3D0,F3D8,所以d的地址相差8B。因为d的内容存的是c的地址,所以地址大小是8B。这里是整型数据的地址,如果是char类型的地址同样是8B,感兴趣的可以自行尝试。

cpp 复制代码
//d表示c
for (int i = 0; i < 3; i++) {
	printf("c[%d]=%d ", i, *(d[i]));
}

这里解d的各元素的地址,找到d的各元素的内容(c的地址)对应的值。

五、二维数组e

cpp 复制代码
//定义二维数组
int e[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
//打印二维数组
for (int i = 0; i < 3; i++) {
	for (int j = 0; j < 3; j++) {
		printf("%d ", e[i][j]);
	}
	printf("\n");
}
//打印二维数组的地址
printf("e=%p\n", e);
//打印二维数组各元素的地址
for (int i = 0; i < 3; i++) {
	printf("e[%d]=%p ", i, &e[i]);
}

发现:e和e[0]的地址一样,e[0]=F458,e[1]=F464,e[2]=F470

结论一:因为e和e[0]的地址一样,所以二维数组e的地址是二维数组e是首地址

结论二:e[0]=F458,e[1]=F464,e[2]=F470,各地址相差12B。因为定义二维数组有3列,一个int型数据是占4B。一行3列就是3个int型数据,也就是12B.

六、数组指针f

cpp 复制代码
int(*f)[3] = e;
for (int i = 0; i < 3; i++) {
	printf("f[%d]=%p ",i, f[i]);
}

发现:f的内容和e的地址相同

结论一:int(*f)[3],因为()的优先级大于[],()中是*p,所以这是一个指针。这个指针叫f,[]说明这个指针指向的内容是一个数组,int说明这个数组的元素是int型。所以这是一个指向由整形数据组成的数组的指针。

结论二:让这个数组指针等于e,所以把e的地址给了f,所以f的内容和e的地址相同。

相关推荐
业精于勤的牙3 小时前
浅谈:算法中的斐波那契数(二)
算法·职场和发展
不穿格子的程序员4 小时前
从零开始写算法——链表篇4:删除链表的倒数第 N 个结点 + 两两交换链表中的节点
数据结构·算法·链表
liuyao_xianhui4 小时前
寻找峰值--优选算法(二分查找法)
算法
dragoooon344 小时前
[hot100 NO.19~24]
数据结构·算法
南棱笑笑生5 小时前
20251217给飞凌OK3588-C开发板适配Rockchip原厂的Buildroot【linux-5.10】后调通ov5645【只能预览】
linux·c语言·开发语言·rockchip
Tony_yitao5 小时前
15.华为OD机考 - 执行任务赚积分
数据结构·算法·华为od·algorithm
C雨后彩虹6 小时前
任务总执行时长
java·数据结构·算法·华为·面试
风筝在晴天搁浅6 小时前
代码随想录 463.岛屿的周长
算法
aduzhe6 小时前
int32 - int32MAX 出现异常
c语言·stm32