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

相关推荐
懒大王就是我16 分钟前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
半盏茶香19 分钟前
【C语言】分支和循环详解(下)猜数字游戏
c语言·开发语言·c++·算法·游戏
徐子童24 分钟前
双指针算法习题解答
算法
小堇不是码农25 分钟前
在VScode中配置C_C++环境
c语言·c++·vscode
想要打 Acm 的小周同学呀33 分钟前
LRU缓存算法
java·算法·缓存
小肥象不是小飞象36 分钟前
(六千字心得笔记)零基础C语言入门第八课——函数(上)
c语言·开发语言·笔记·1024程序员节
劲夫学编程2 小时前
leetcode:杨辉三角
算法·leetcode·职场和发展
毕竟秋山澪2 小时前
孤岛的总面积(Dfs C#
算法·深度优先
浮生如梦_4 小时前
Halcon基于laws纹理特征的SVM分类
图像处理·人工智能·算法·支持向量机·计算机视觉·分类·视觉检测
励志成为嵌入式工程师5 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim