char *p = "some string"
创建一个指向包含字符串的 block 的指针 p。
char p[] = "some string"
创建一个字符数组并在其中包含文字。
而且第一个是常量声明,二维数组也是这样吗?
有什么区别
char **p,char *p[],char p[][].
我读到一些关于 char **p 创建指针数组的信息,因此与 char p[][]
相比,它有一个开销来存储指针值。
前两个声明创建了常量数组。当我试图在 main(int argc,char **argv)< 中修改
。是因为它们是在函数原型(prototype)中声明的吗?argv
的内容时,我没有遇到任何运行时错误
最佳答案
普通声明(不是函数参数)
char **p;
声明一个指向 char
的指针。它为指针保留空间。它不为指向的指针或任何 char
保留任何空间。
char *p[N];
声明一个 N 指向 char
的指针数组。它为 N 指针保留空间。它不为任何 char
保留任何空间。 N
必须显式提供,或者在带有初始化器的定义中通过让编译器计算初始化器来隐式提供。
char p[M][N];
声明了一个包含 M 个 N char
数组的数组。它为 M•N char
保留空间。没有涉及的指针。 N
必须明确提供。 M
必须显式提供,或者在带有初始化器的定义中通过让编译器计算初始化器来隐式提供。
函数参数声明
char **p
声明一个指向 char
的指针。调用该函数时,会为该指针提供空间(通常在堆栈或处理器寄存器中)。没有为指向指针或任何 char
保留空间。
char *p[N]
调整为char **p
,所以同上。 N
的值被忽略,N
可能不存在。 (一些编译器可能会计算N
,所以,如果它是一个有副作用的表达式,比如printf("Hello, world.\n")
,这些效果可能会发生调用函数时。C 标准对此不明确。)
char p[M][N]
调整为char (*p)[N]
,所以是指向数组的指针N 字符
。 M
的值被忽略,M
可能不存在。必须提供 N
。调用函数时,会为指针提供空间(通常在堆栈或处理器寄存器中)。 N char
数组没有预留空间。
参数
argv
是由调用main
的特殊软件创建的。它充满了软件从“环境”中获取的数据。您可以修改其中的 char
数据。
在您的定义 char *p = "some string";
中,您不允许修改 p
指向的数据,因为 C 标准规定字符不能修改字符串文字。 (从技术上讲,它说的是,如果您尝试,它不会定义行为。)在这个定义中,p
不是数组;它是数组。它是指向数组中第一个 char
的指针,那些 char
位于字符串文字中,不允许修改字符串文字的内容。
在你的定义char p[] = "some string";
中,你可以修改p
的内容。它们不是字符串文字。在这种情况下,字符串文字在运行时实际上并不存在;它只是用来指定数组 p
是如何初始化的。 p
初始化后,您可以对其进行修改。
argv
的数据设置允许您修改它(因为 C 标准指定了这一点)。
关于c - char **p,char *p[],char p[][]的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19325240/