请考虑:

char amessage[] = "now is the time";
char *pmessage = "now is the time";

我从第二版《The C Programming Language》中读到,上述两种说法并不相同.

我一直认为数组是一种方便的方法来操作指针来存储一些数据,但事实显然不是这样...在C语言中,数组和指针之间的"非平凡"区别是什么?

推荐答案

没错,但这是一个微妙的区别.基本上,前者:

char amessage[] = "now is the time";

定义其成员位于当前作用域的堆栈空间中的数组,而:

char *pmessage = "now is the time";

定义一个指针,该指针位于当前作用域的堆栈空间中,但引用其他位置的内存(在本例中,"现在是时间"存储在内存的其他位置,通常是字符串表).

另外,请注意,由于属于第二个定义(显式指针)的数据未存储在当前作用域的堆栈空间中,因此未指定其确切存储位置,不应修改.

编辑:正如Mark、GMan和Pavel所指出的,当运算符的地址用于这些变量中的任何一个时,也会有差异.例如;pmessage返回char**类型的指针,或指向chars的指针,而&;amessage返回一个char(*)[16]类型的指针,或者一个指向一个包含16个字符的数组的指针(与char**一样,需要像litb指出的那样取消引用两次).

C++相关问答推荐

C中char数组指针的问题

为什么macOS上的FIFA管道比匿名管道慢8倍?

如何从C中的公钥字符串创建EVP_PKEY

librsvg rsvg_handle_get_dimensions获取像素大小与浏览器中的渲染大小没有不同

Zig将std.os.argv转换为C类型argv

使用单个字节内的位字段

括号中的堆栈实现错误问题

两个连续的语句是否按顺序排列?

ESP32在vTaskDelay上崩溃

使用C时,Windows CMD中的argc参数是否包含重定向命令?

插座打开MacOS组件

防止规范模式在C++中 echo 特殊字符

CGO:如何防止在使用CGO在包中包含C头文件时出现多个定义...&q;错误?

I2C外设在单次交易后出现故障

错误...的多个定义(&Q)首先在这里定义&

-Wnonnull-Compare警告不是具有误导性吗?

如何在zOS上编译共享C库

在C中交换字符串和数组的通用交换函数

令人困惑的返回和 scanf 问题相关

模仿 memmove 的行为