c - C 中没有索引的数组的引用

标签 c arrays pointers

假设以下示例:

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_aptr_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_cuint8**

有一种常见的误解,认为指针到指针在某种程度上与数组相关。这是完全错误的,它们与数组无关。这种误解的根源是这样的查找表:

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/

相关文章:

c# - 数组越大,C# 数组调整大小所需的时间越长吗?

c++ - 使用指向类的指针分配错误

c - C标准是否指定递增指针时进位传播的距离?

c - 我无法理解以下代码中的位置 c=0 和 l=0

c - 使用 write() 将变量的字节写入文件描述符?

c - 使用 C 程序将输入数据的十六进制转换为整数

c - 程序不将数组写入文件

Java:在对象数组中,如何提取指定子类的对象

c - 中止陷阱 : 6, 使用 memcpy 复制数组

c++ - 如何删除集合中的对象