这里,我仅使用一个循环就可以访问2D数组的元素。因此,看来我不需要将这个数组作为2D进行学习。
#include <stdio.h>
#include <process.h>
main()
{
int array[][3] = {11, 22, 33, 44, 55, 66, 77, 88, 99};
int * pArr = &array;
int i=0;
printf("Addr\tValue\n");
for(i=0 ; i<9 ; i++)
{
printf("%d\t%d\n", &pArr[i], pArr[i]);
}
system("PAUSE");
}
Addr Value
2358344 11
2358348 22
2358352 33
2358356 44
2358360 55
2358364 66
2358368 77
2358372 88
2358376 99
为什么C允许我们这样做?
取决于您的意思。这是一种可能的解释:
int x[5][10]; // 2D array
int (*p)[5][10] = &x; // Pointer to 2D array
(*p)[3][2] = 1; // Dereferencing pointer
这是另一个:
int x[5*10]; // 1D array
int *p = x; // Pointer to first element of array
p[3*10+2] = 1; // Dereferencing pointer
这是另一个:
int **p; // Pointer to pointer
p = malloc(sizeof(*p) * 5); // Create array of pointers
for (int i = 0; i < 5; i++)
{
p[i] = malloc(sizeof(p[i]) * 10); // Create array of ints
}
p[3][2] = 1; // Dereferencing pointer
...
// Clearup
for (int i = 0; i < 5; i++)
{
free(p[i]);
}
free(p);
int **pointer;
指针保存int *
个元素的集合的第一个元素的地址。
第一个元素是int *
指针。
该元素可能指向实际的int
。
因此,指针指向指针集合的第一个元素,其中第一个元素指向一个int。如果将pointer
加1,则会得到下一个可能指向int的指针
这是C指针算术中“ 2D”的含义。
您不能;指针只会告诉您要看哪里,而不是目标是什么。
以此示例2D数组:
1 2 3 4
5 6 7 8
9 0 1 2
这将在内存中表示为
1 2 3 4 5 6 7 8 9 0 1 2
仅当您知道这是一个int[3][4]
时,您才能再次获得该数组。 C不存储它是int[2][6]
还是int[3][4]
。
[If您知道数组的尺寸,这很容易,因为您可以简单地分配它。