c - 为什么在为二维数组分配指针时需要指定行?

标签 c pointers multidimensional-array implicit-conversion

当没有提到二维数组的行时,编译器声明“从不兼容的指针类型赋值”,我一直认为没有括号的数组表示第一个元素的地址,在这种情况下是元素 twodstring[0] 的地址[0]

当提到该行时,编译器不会指出错误,我想知道为什么会这样?

#include<stdio.h>

int main()
{

  char onedstring[]={"1D Array"};
  char twodstring[][5]={"2D","Array"};
  char *p1,*p2;

  p1=onedstring;
  p2=twodstring;
  p2=twodstring[1];

}

最佳答案

二维数组

char a[M][N];

可以通过以下方式使用 typedef 声明

typedef char T[N];

T a[M];

因此指向数组 a 的第一个元素的指针可以这样声明

T *p = a;

其中 T 是类型 char[N] 的别名。现在进行反向替换,我们可以写

char ( *p )[N] = a;

也就是说二维数组的元素都是一维数组。

这个声明

char ( *p )[N] = a;

相当于

char ( *p )[N] = &a[0];

其中 a[0] 的类型为 char[N]。所以指针指向数组的第一“行”。

取消引用指针,您将获得类型为 char[N] 的对象。

注意二维数组可以这样声明

char ( a[M] )[N];

所以用一维数组声明符 a[M] 代替指针你会得到

char ( a[M] )[N];
char (  *p  )[N] = a;

如果你将这样声明一个指针

char *p1;

那么你可以这样写

p1 = a[1];

在此表达式中,a[1]char[N] 类型的一维数组。使用表达式作为初始值设定项,数组将转换为指向其第一个类型为 char * 的元素的指针。

所以这个表达式语句

p1 = a[1];

相当于

p1 = &a[1][0];

取消引用此指针,您将获得类型为 char 的对象。

关于c - 为什么在为二维数组分配指针时需要指定行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47081504/

相关文章:

c++ - 如何初始化 int *const *const?

python - 获取 3D 或 4D 数组作为输入,并在外部脚本的函数中将其 reshape 为 2D 数组

c - "initialization makes integer from pointer without a cast"数组初始化中逐渐减弱

c++ - C/C++ 指针技巧修复

c - 从函数返回结构体的动态数组

c - C 中字符串的第一个元音的地址 - 这有什么问题?

c# - 在 C# 中声明一个不知道其大小的二维数组

Code Composer 和实时数据交换 : problems in Target to Host communication

c - ansi C fprintf ("File_Name","a") 将最后打印的字符串放在文件顶部

c - ls 与 nohup 配合不好