我知道C中的数组只是指向顺序存储数据的指针.但是符号[]和*的不同意味着什么呢.我的意思是在所有可能的使用环境中.

char c[] = "test";

如果在函数体中提供此指令,则在

char* c = "test";

将指向一个数据(只读)段.

你能列出这两种符号在所有使用上下文中的所有差异,以形成一个清晰的总体视图吗.

推荐答案

根据C99标准:

数组类型描述连续分配的非空数组集

  1. 数组类型由其元素类型和

指针类型可以从函数类型、对象类型或

根据标准声明…

char s[] = "abc", t[3] = "abc";
char s[] = { 'a', 'b', 'c', '\0' }, t[] = { 'a', 'b', 'c' };

…是一模一样的.数组的内容是可修改的.另一方面,声明…

const char *p = "abc";

…使用类型pointer to constant 100定义p,并将其初始化为指向长度为4的类型constant array of 100(in C++)的对象,该对象的元素用字符串文字初始化.如果试图使用p修改数组的内容,则行为未定义.

根据6.3.2.1 100,解引用和数组下标是相同的:

下标运算符[]的定义是E1[E2]

数组与指针的区别在于:

  • 指针后面没有内存大小的信息(没有可移植的方式获取它)
  • 无法构造类型不完整的数组
  • 指针类型可以从不完整类型派生
  • 指针可以定义递归 struct (这是前两种 struct 的结果)

更多关于这个主题的有用信息可以在http://www.cplusplus.com/forum/articles/9/页找到

C++相关问答推荐

在C中,entry = fgets(entry,sizeof(entry),*pt)是否是错误?

定义_MISIX_C_SAL时,在MacOS上编译失败,并出现奇怪错误

如何将一个enum类型类型转换为另一个类型?

ISO_C_BINDING,从Fortran调用C

为什么PLT表中没有push指令?

Ruby C Api处理异常

为什么STM32G474RE上没有启用RCC PLL

插座打开MacOS组件

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

防止C++中递归函数使用堆栈内存

如何读取文件并将内容保存在字符串中?(在C语言中,没有崩溃或核心转储错误)

获取前2个连续1比特的索引的有效方法

C11/C17标准允许编译器清除复合文字内存吗?

从BIOS(8086)中读取刻度需要多少?

int * 指向int的哪个字节?

是否有单独的缓冲区用于读写库调用?

为什么GCC 13没有显示正确的二进制表示法?

try 判断长整数是否为素数

生成的头文件不包括用户定义的文件

为什么GCC不能在 struct 初始值设定项中以sizeof作为条件的三进制中处理复合文字的编译时求值?