假设以下示例:
uint8 myArr[4] = {0, 1, 2, 3};
uint8* ptr_a, ptr_b, ptr_c, ptr_test;
uint8** ptrptr_c;
void main(void)
{
ptr_a = &myArr[4]; // Address of myArr
ptr_b = myArr; // Address of myArr
ptr_c = &myArr; // --> Address of myArr again?! <---
ptrptr_c = &myArr; // --> Address of myArr again?! <--
ptr_test = &ptr_a // Address of ptr_a (whose content points to myArr)
}
ptr_a
和 ptr_b
包含 myArr
的地址对我来说非常清楚。
但我实际上假设,ptr_c
将包含某种地址,其中存储了 myArr
的地址(类似于 ptr_test
)。
那么,为什么ptr_c
(或ptrptr_c
)包含myArr
的地址?
最佳答案
- 永远不要在同一行声明多个变量。或者你会写出像
uint8* ptr_a, ptr_b, ptr_c, ptr_test;
这样的错误,只有第一个变量被声明为指针。 ptr_c = &myArr 不是有效的指针转换,因为
&myArr
的类型是uint8 (*)[4]
,数组指针。数组指针与任何其他指针类型一样工作,尽管它指向整个数组。所以my_array_pointer+1
给你下一个数组,就像my_int_pointer+1
给你下一个 int(下一个指向的项目)。数组指针指向整个数组,因此它将包含第一项的地址。这就是为什么
myArr
和&myArr
给出相同的地址(但类型不同)。您不能将数组指针分配给普通指针。此行不应在没有警告/错误的情况下编译。
ptrptr_c = &myArr;
是相同的无效指针转换,除了ptrptr_c
是uint8**
。
有一种常见的误解,认为指针到指针在某种程度上与数组相关。这是完全错误的,它们与数组无关。这种误解的根源是这样的查找表:
int** pptr = malloc(n*sizeof(*pptr));
...
pptr[i] = malloc(n*sizeof(*pptr[i]));
不好的书/教程/老师倾向于说上面是一个二维数组,其实不是。
参见 Correctly allocating multi-dimensional arrays忘记这种不正确的信念。它还对数组指针做了一些解释。
关于c - C 中没有索引的数组的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43391799/