为什么编译器将char * p [10]视为char ** p?

克里斯·米德尔顿

我一直在摆弄,看看是否有任何方法可以在传递给函数时自动保留有关数组长度的信息(请参见此处的其他问题:为什么这个数组大小“变通办法”会向我发出警告?),但是我的问题是更多的是关于gcc提供的警告,这对我来说没有任何意义。

根据网站(EDIT:我误读了该网站),char *p[10]声明了一个指向10个字符的数组的指针。但是,当我尝试将指向数组的指针传递给函数时,我从编译器收到以下错误消息:

在此处输入图片说明

这是程序的其余部分:

在此处输入图片说明

我知道,将数组传递给函数时,它会衰减为指针(丢失有关其长度的信息),但是声明本身似乎在衰减。这里发生了什么?

编辑:当我更换char *p[10]使用char (*p)[10],它没有给出警告了,更重要的是,它会显示正确数组长度:10,我想我的问题是:1)为什么括号改变的事情?和2)这是众所周知的解决方法,还是我依赖​​于无法保证编译器的某些行为?(即数组长度信息可以通过间接传递指向它的指针来传递吗?)

大卫·赫弗南(David Heffernan)

实际上char *p[10]是一个指向的指针,其长度为10 char您正在寻找char (*p)[10]这是指向长度为10的数组的指针char

您可能会发现http://cdecl.org/是一个有用的资源,可以帮助您测试对声明的理解。

关于动态数组的讨论,您将不得不接受的是,一旦动态分配了数组,系统将无法为您提供恢复数组长度的方法。记住这些信息是您的责任。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么* p为(char * p =“ hello world”)返回整数

为什么“ auto ch = unsigned char {'p'}”不能在C ++ 17下编译?

是`char * p = 0; std :: equal(p,p,p)`是否根据C ++标准定义好?

为什么编译器将“ char”与“ int”而不是“ short”匹配?

为什么我的编译器将字符串理解为const char []?

哪里删除动态内存“ char p”?

(定义(p)(p))是什么?

为什么co-P = P

将char []固定在P / Invoke通话上

为什么 main 和 func 函数的 char 指针 p 的输出不同?

为什么在此scala代码段中,编译器会丢失有效负载的类型[P]?如何制作此代码段?

将<p> </ p> HTML中心与图片对齐

为什么对于char,编译器为什么更喜欢int重载而不是varargs char重载?

为什么ntpd -p超时?

为什么 p 的值是假的?

为什么<p>元素是绿色的?

Python ctypes设置c_char_p基础值

如何获取ctypes.c_char_p实例的指针地址

难以理解char(* p)[sizeof(c)]的优先原则;

ctypes-查看返回的结构的c_char_p字段

Python ctypes'c_char_p'内存泄漏

ctypes c_char_p的不同行为?

cron的-p是什么?

$(“ <p />”)的含义是什么?

什么是 Tcl 中的 %P?

在Excel单元格中,为什么=“ P10-12” <“ P1-9”给我TRUE?

为什么编译器将 System.Object 设置为 False 时将其视为 null

为什么编译器将GCC中的嵌套函数(GNU扩展)的地址视为“非常数”?

'template< unsigned N, unsigned M> int compare(char p1 [N], char p2 [M])'有什么问题