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的地址相同。

相关推荐
茉莉玫瑰花茶9 分钟前
C++ 17 详细特性解析(4)
开发语言·c++·算法
mancy_12121212 分钟前
复古C语言代码复活!——以121+hello.c为例摘要
c语言·vscode·gitee·visual studio·新人首发·turbo c
long31623 分钟前
K‘ 未排序数组中的最小/最大元素 |期望线性时间
java·算法·排序算法·springboot·sorting algorithm
进击的小头27 分钟前
FIR滤波器实战:音频信号降噪
c语言·python·算法·音视频
xqqxqxxq31 分钟前
洛谷算法1-1 模拟与高精度(NOIP经典真题解析)java(持续更新)
java·开发语言·算法
razelan31 分钟前
初级算法技巧 4
算法
砍树+c+v32 分钟前
3a 感知机训练过程示例(手算拆解,代码实现)
人工智能·算法·机器学习
zy_destiny33 分钟前
【工业场景】用YOLOv26实现4种输电线隐患检测
人工智能·深度学习·算法·yolo·机器学习·计算机视觉·输电线隐患识别
智驱力人工智能43 分钟前
货车违规变道检测 高速公路安全治理的工程实践 货车变道检测 高速公路货车违规变道抓拍系统 城市快速路货车压实线识别方案
人工智能·opencv·算法·安全·yolo·目标检测·边缘计算
罗湖老棍子1 小时前
【例9.18】合并石子(信息学奥赛一本通- P1274)从暴搜到区间 DP:石子合并的四种写法
算法·动态规划·区间dp·区间动态规划