Ale*_*tko 37 c c++ arrays standards pointers
我知道C中的数组只是指向顺序存储数据的指针.但是,差异意味着符号[]和*的区别.我的意思是在所有可能的使用环境中 例如:
char c[] = "test";
Run Code Online (Sandbox Code Playgroud)
如果在函数体中提供此指令,它将在堆栈上分配字符串
char* c = "test";
Run Code Online (Sandbox Code Playgroud)
将指向数据(只读)段.
您是否可以在所有使用情境中列出这两种表示法之间的所有差异,以形成清晰的一般视图.
Ser*_* K. 26
根据C99标准:
数组类型描述了具有特定成员对象类型的连续分配的非空对象集,称为元素类型.
36)数组类型的特征在于它们的元素类型和数组中元素的数量.数组类型据说是从其元素类型派生的,如果它的元素类型是
T,则数组类型有时称为数组T.从元素类型构造数组类型称为数组类型派生.
指针类型可以从函数类型,对象类型或不完整类型派生,称为引用类型.指针类型描述一个对象,其值提供对引用类型的实体的引用.从引用类型派生的指针类型
T有时被称为指向T.从引用类型构造指针类型称为指针类型派生.
根据标准声明......
char s[] = "abc", t[3] = "abc";
char s[] = { 'a', 'b', 'c', '\0' }, t[] = { 'a', 'b', 'c' };
Run Code Online (Sandbox Code Playgroud)
......是完全相同的.数组的内容是可修改的.另一方面,宣言......
const char *p = "abc";
Run Code Online (Sandbox Code Playgroud)
...定义p作为指向常量char的类型,并将其初始化为指向一个对象,其类型为常量数组char(在C++中),长度为4,其元素用字符串文字初始化.如果尝试使用p修改数组的内容,则行为未定义.
根据6.3.2.1 数组下标解除引用和数组下标是相同的:
下标操作符的定义
[]是E1[E2]相同(*((E1)+(E2))).
数组与指针的区别在于:
这些链接可能对主题有用:
char c[] = "test";
Run Code Online (Sandbox Code Playgroud)
这将创建一个包含字符串测试的数组,以便您可以修改/更改任何字符
c[2] = 'p';
Run Code Online (Sandbox Code Playgroud)
但,
char * c = "test"
Run Code Online (Sandbox Code Playgroud)
它是一个字符串文字 - 它是一个const char.
因此,对此字符串文字进行任何修改都会给我们带来段错误.所以
c[2] = 'p';
Run Code Online (Sandbox Code Playgroud)
现在是非法的,并给我们段错误.