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

零、存储单元和地址

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

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

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

一、变量a

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

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

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

二、指针b

//指针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存储单元的内容

	//通过b访问a
	printf("a=%d\n", *b);

三、数组c

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

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,感兴趣的可以自行尝试。

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

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

五、二维数组e

//定义二维数组
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

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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值