char*s []和char(*s)[]之间有什么区别?

sto*_*ren 11 c pointers

当我阅读有关C语言的书籍时,两级指针给我带来了很多困扰.

char s[5][5];
char *s[5];
char (*s)[5];
Run Code Online (Sandbox Code Playgroud)

那么他们之间有什么区别?

ssm*_*ssm 16

在C中,最好说出声明.然后,它变得直观.为此,您遵循左右惯例.这是怎么回事:

char *s[5];
Run Code Online (Sandbox Code Playgroud)

你怎么说话呢?为此,您从变量名称的右侧开始,s然后转到左侧.所以你先说"s是a/an",在右边,你看到了一个[],你说"s是一个数组......".然后你走到左边看看*,然后说"s是一个指针数组." 这就是它.它是一个5指针的数组.您可以在此数组中存储不同的指针.

现在换另一个:

char (*s)[5];
Run Code Online (Sandbox Code Playgroud)

你以同样的方式开始."s是a/an",然后看看().内的任何()必然s比什么都更接近外.所以它比... *更紧密.所以你现在说,"s是一个指针......"现在你走出括号并看到了.所以你继续说,"s是一个指向数组的指针".而这正是它的本质.它是一个指针,指向数组的第一个元素.s[][]

现在遵循相同的逻辑,并尝试猜测以下内容:

int (*callme)(int a, int b)
int (*callme[10])(int a, int b)
Run Code Online (Sandbox Code Playgroud)

提示,最后一个可用于为函数创建查找表.

编辑:

正如评论中所提到的,一char开始也有一个.我从来没有能够找到一种简单的方式来说明这一点,但从上下文中可以清楚地看出来.例如,在第一个示例中,char定义了数组的类型,而在第二个示例中,它定义了指针.在我发布的练习中,int定义了函数返回值的类型.通常使用这些定义,将只有一个具有未定义类型的项.这就是我如何弄清楚类型的去向.


小智 8

  • 首先是二维char数组
  • 第二个是指向char的指针数组
  • 第三个是指向char数组的指针