c - char **p,char *p[],char p[][]的区别

标签 c

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)< 中修改 argv 的内容时,我没有遇到任何运行时错误。是因为它们是在函数原型(prototype)中声明的吗?

最佳答案

普通声明(不是函数参数)

char **p; 声明一个指向 char 的指针。它为指针保留空间。它不为指向的指针或任何 char 保留任何空间。

char *p[N]; 声明一个 N 指向 char 的指针数组。它为 N 指针保留空间。它不为任何 char 保留任何空间。 N 必须显式提供,或者在带有初始化器的定义中通过让编译器计算初始化器来隐式提供。

char p[M][N]; 声明了一个包含 MN char 数组的数组。它为 MN 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/

相关文章:

c - 未知类型名称 - MINGW 中的 'DEV_BROADCAST_DEVICEINTERFACE'

c++ - 在 Linux 上以编程方式为 gdb 在 C 或 C++ 代码中设置断点

c - 为什么我的内核日志没有显示最新的输出?

python - 如何使用 pyparsing 构建完整的 C 解析器?

c++ - 显示指定地址的 16 个字节的内容(十六进制)

c - 执行 typedef 时初始化结构数组

c - 以 float 和 int 表示形式计算 c 中表达式的不同值?

c - 如何用C语言学习编程

c - 在 C 中将二维数组引用到函数和逗号分隔语句的其他最佳或更好的方法

c++ - pow(x,3.0f) 与 x*x*x 的性能对比?