c - 指向指针的指针和指向二维数组的指针之间的区别

标签 c pointers multidimensional-array pointer-to-pointer

  1. 如果我有一个二维数组 B 定义为:

    int B[2][3] = {{1,3,5},{2,4,6}};
    

    int **p = Bint (*p)[3] = B 相同吗?

  2. int **f = B; printf("%d ",*f+1);

    给出 5 作为输出,而 printf("%d ",*f) 给出 1 作为答案。为什么 发生这种事了吗?

  3. printf("%d ",**f);

    返回段错误!为什么?

最佳答案

  1. 没有。 int **p = B; 是一个错误。 (既是编译错误,又是逻辑错误)。 int ** 必须指向 int *。但是,B 中没有存储 int *B 是一组连续的 int,不涉及指针。

  2. int **f = B; 必须给出编译错误。由此生成的任何可执行文件的行为完全未定义。

  3. 参见 2。


解释为什么您可能会看到 15。 (C 标准没有定义这一点,但你的编译器无论如何都会提前)。可能您的编译器将该行视为

int **f = (int **)B;

然后表达式*f将从B的存储中读取字节(实际上保存int)并假装这些是组成指针表示的字节。这是进一步未定义的行为(违反严格别名规则)。这样做的结果可能是*f是一个指向地址0x00000001的指针。

然后使用 %d 打印指针,导致进一步的未定义行为。您会看到 1,因为您的系统使用与传递 int * 相同的方法将 int 传递给 printf

当您将 1 添加到 (int *)0x00000001 时,您会得到 (int *)0x00000005,因为递增指针意味着指向该类型的下一个元素。

当您取消引用该指针时,它会导致段错误,因为该地址超出了您的有效地址空间。

关于c - 指向指针的指针和指向二维数组的指针之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25080413/

相关文章:

c++ - 等于指针值正在改变指针引用

python - 有效地将每一行的元素相乘

具有相同声明但不同实现的 C 头文件

c - 实现一个函数,该函数返回最长的 1 或 0 序列及其第一个索引

c - while 循环中的增量不起作用?

c - 警告 : Incompatible Pointer Type

javascript - 在 JavaScript 中初始化 2D 和 3D 数组

php - 使用 foreach 进行复杂的多维关联数组处理

c - 我不知道另外 1 个来自哪里

DNA 转化为蛋白质 - c 结构问题