零、存储单元和地址
计算机在保存数据时,把数据放在一个个存储单元中,存储单元可以理解为一个个小房间。
地址就是存储单元(小房间)的房间号,且这个房间号是唯一的。
详细请学习计算机组成原理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的地址相同。