为什么在C中可以使用以下内容?
#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
答案 0 :(得分:2)
这取决于你的意思。这是一种可能的解释:
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);
答案 1 :(得分:0)
你不能;指针只会告诉你在哪里看,而不是目标是什么。
以二维数组为例:
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]
。
如果您知道数组的尺寸,就会变得简单,因为您可以简单地分配它。
答案 2 :(得分:0)
int **pointer;
指针保存int *
元素集合的第一个元素的地址。
第一个元素是int *
指针。
该元素可能指向实际的int
。
因此,指针指向指针集合的第一个元素,其中第一个元素指向int。如果向pointer
添加1,则会得到可能指向int
这就是“2D”在C指针算术中的含义。