什么是“int (**p)[2];”?

Nim*_*ain 1 c arrays pointers for-loop implicit-conversion

问题是这样的:

#include <stdio.h>

int main()
{
    int a[2][2] = { {6, 2}, {3, 4} };
    
    int (**p)[2];
    p = a;
    
    for (int i = 0; i < 4; i++) {
        printf("%p\n", (*p + i));
        printf("%d\n", *(*p + i));
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我将其解释int(**p)[2];为一个指向大小为 2 的一维数组的双指针。

我得出这个结论是因为:

  1. int *p[2];表示大小为 2 的整数指针数组。
  2. int (*p)[2];表示指向大小为 2 的一维数组的整数指针。

所以,

  1. int **p[2];表示大小为 2 的整数双指针数组。
  2. int (**p)[2];表示指向大小为 2 的一维数组的整型双指针。

1、2、3 和 4 项陈述中哪些是正确的,哪些需要更正?

因此,这段代码的输出是什么?

在这里尝试过。

Adr*_*ica 5

您的“断言”(1、2、3 和 4)基本上都是正确的。但是,我会使用不同的、更具体的术语,特别是避免使用术语“双指针”。(这可能是 \xe2\x80\x93 并且经常被 \xe2\x80\x93 错误解释和/或误用。)

\n

所以:

\n
    \n
  1. int *p[2];声明p为两个指向整数的指针的数组;
  2. \n
  3. int (*p)[2];声明p为指向两个整数数组的指针;
  4. \n
  5. int **p[2];声明p为一个由两个元素组成的数组,每个元素都是一个指向整数的指针;
  6. \n
  7. int (**p)[2];声明p为指向两个整数数组的指针。
  8. \n
\n
\n
\n

\xe2\x80\xa6 这段代码的输出是什么?

\n
\n

由于该行,代码格式不正确p = a;。此外,该行表现出未定义的行为,因为格式说明符(需要参数)和提供的参数(具有类型)printf("%d\\n", *(*p + i));之间不匹配。%dint*(*p + i)int*

\n
\n

您的代码版本不会表现出未定义的行为,并且可能会执行您正在寻找的操作,如下所示(请阅读注释):

\n
#include <stdio.h>\n\nint main()\n{\n    int a[2][2] = { {6, 2}, {3, 4} };\n    int(**p)[2];\n    int(*t)[2] = &a[0]; // a pointer to an array of 2 integers (1st half of "a")\n//  int(*t)[2] = a;     // Works the same as "a" decays to address of 1st element\n    p = &t;             // "p" is now (correctly) a pointer to that pointer\n    for (int i = 0; i < 2; i++) { // Going beyond 2 elements is UB (but MAY work)\n        printf("%p\\n", (void*)(*p + i)); // Arguments for "%p" should be void*\n        printf("%d\\n",  (**p)[i]); // Dereference "p" twice then get array element\n    }\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n