指针与数组是C语言中的重要组成部分,它们不一样却又有着紧密的联系。下面将用几个代码例子展示它们的关系。
#include
#include
int main(void){
// 一维数组
printf("Size of int: %d(byte)\n", sizeof(int));
printf("Addresses of array\n");
int arr[3] = {1, 2, 3}, i, j;
for(i = 0; i < 3; i++){
printf("%d:\t%d\n", arr + i, *(arr + i));
}
// 二维数组
printf("Addresses of two dimensional array\n");
int mat[2][3] = {1, 2, 3, 4, 5, 6};
int *p = mat;
printf("%d:\t%d\n", &p, p);
for(i = 0; i < 6; i++){
printf("%d:\t%d\n", p+i, *(p+i));
}
// 一维指针
printf("Addresses of one dimensional pointer\n");
p = (int*) malloc(sizeof(int) * 4);
printf("%d:\t%d\n", &p, p);
for(i = 0; i < 4; i++){
*(p + i) = i;
}
for(i = 0; i < 4; i++){
printf("%d:\t%d\n", p+i, *(p+i));
}
// 二维指针
printf("Addresses of two dimensional pointer\n");
int** ptr = (int**) malloc(sizeof(int*) * 4);
printf("%d:\t%d\n", &ptr, ptr);
for(i = 0; i < 4; i++){
*(ptr + i) = (int*) malloc(sizeof(int) * 2);
}
for(i = 0; i < 4; i++){
for(j = 0; j < 2; j++){
*(*(ptr+i) + j) = i * 2 + j;
}
}
for(i = 0; i < 4; i++){
printf("%d:\t%d\n", ptr + i, *(ptr + i));
}
printf("==\n");
for(i = 0; i < 4; i++){
for(j = 0; j < 2; j++){
printf("%d:\t%d\t%d\n",*(ptr + i) + j, *(*(ptr + i) + j), ptr[i][j]);
}
printf("==\n");
}
// 下面的程序是必须的,否则内存泄漏,导致内存占用过多
free(p);
for(i = 0; i < 4; i++){
free(*(ptr + i));
}
free(ptr);
return 0;
}
Size of int: 4(byte)
Addresses of array
6487584: 1
6487588: 2
6487592: 3
//可以看到每个元素的地址值依次加4(一个int的大小),这里数组名加元素序号直接指向该元素的地址
Addresses of two dimensional array
6487544: 6487552
6487552: 1
6487556: 2
6487560: 3
6487564: 4
6487568: 5
6487572: 6
//输出的第一个地址&p,是指针所在的地址,第二个地址p才是指针中存放的地址,即指针指向的地址。
//可以看到在二维数组中,元素们也是挨着存放的
Addresses of one dimensional pointer
6487544: 11824256
11824256: 0
11824260: 1
11824264: 2
11824268: 3
//一维指针,可以看出和一维数组的情况基本一样
Addresses of two dimensional pointer
6487536: 11824288//这里的指针本身所在地址和它存下的地址不同,正如前面所演示的
11824288: 11824336
11824296: 11824368
11824304: 11824400
11824312: 11824432
//这里二维数组中每个指向一维数组的指针,它们所在的位置是挨着的,因为指针所占大小为8;而它们指向的地址并不相邻 (没有规定这个应该是相邻的!)
==
11824336: 0 0
11824340: 1 1
//可见二维数组中的每一个一维数组的存储方式和上面例子的演示一样
==
11824368: 2 2
11824372: 3 3
==
11824400: 4 4
11824404: 5 5
==
11824432: 6 6
11824436: 7 7
==
//总结:二维指针的存储形态与二维数组出现了差别。二维数组中依然是每个元素挨着放置存储,而二维指针(把它看成是一个存了 指向一维数组的指针 的一维数组),