繁体   English   中英

int (**p)[2] 声明了什么? 什么将存储在数组 **p 中?

[英]what does int (**p)[2] declare ? And what would be stored in array **p?

什么将存储在数组**p中?

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

    return 0;
}

int (**p)[2]声明了什么?

p 作为指向 int 数组 2 的指针的指针
(非常有用的网站C 乱码 ↔ 英文

什么将存储在数组**p中?

**p数组 2 int

p是一个指针。 p还将存储一个指针。 p中存储的指针指向int的数组 2。

  int array2[2] = {5, 7};
  int (*pointer)[2] = &array2;
  int (**p)[2] = &pointer;
  printf("%d %d\n", (**p)[0], (**p)[1]);  // output "5 7\n"

我认为这个声明中有一个错字。

int (**p)[2];

必须有

int (*p)[2];

也就是说,它是一个指向int[2]类型数组的指针的声明

在这个任务中

p = a;

数组 a 被隐式转换为指向其第一个类型为int[2]的元素的指针。 也就是说,在此赋值中,右侧操作数的类型为int ( * )[2] ,左侧操作数的类型相同。

否则你会得到一个编译数组,因为指针int ( ** )[2]int ( * )[2]不兼容,

在这个 for 循环中

for(i=0;i<4;i++)
    printf("%d  ", *(*p+i));

事实上,对int *类型的指针进行了重新解释。 由于指针p具有int ( * )[2]类型,然后将其解引用,您将获得int[2]类型的左值,但在表达式*p+i中使用该数组依次转换为指向其第一个元素的指针。 那是在表达式*p+i中,您有指向元素a[0][0]指针。

你可以重写表达式

*(*p+i)

喜欢

( *p )[i]

如果使用 int( ** )[2] 类型的指针,那么 function main 的主体可能看起来像

int i, a[2][2]={{1,2},{3,4}};
int (*q)[2] = a;
int ( **p )[2] = &q;

for(i=0;i<4;i++)
    printf("%d  ", *( **p +i ) );

那是添加了访问数组元素的另一种间接方式。

提问者的代码无法编译:

int i, a[2][2]={{1,2},{3,4}};
int (**p)[2];
p=a;

错误 C2440:“=”:无法从“int [2][2]”转换为“int (**)[2]”

如果打算定义一个指向 2x2 数组a的指针,则p应定义为指向 int 数组 2 的数组 2 的指针,并因此使用:

int main()
{
    int a[2][2] = { {1,2},{3,4} };
    int(*p)[2][2];

    p = &a;
    printf("{%d, %d} \n", (*p)[0][0], (*p)[0][1]);
    printf("{%d, %d} \n", (*p)[1][0], (*p)[1][1]);
    return 0;
}

output 是:
{1, 2}
{3, 4}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM