C/C++ int [] vs int*(指针与数组表示法).有什么不同?

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的常量指针"不应该是"指向常量字符"的指针吗?毕竟指针是可修改的. (3认同)
  • “并将其初始化为指向类型为“char 常量数组”的对象”。在 C++ 中,但在 C 中则不然。在 C 中,对象“abc”的类型为“char[4]”。然而,试图修改它是UB。指出差异可能会很好。 (2认同)

nee*_*eel 9

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)

现在是非法的,并给我们段错误.

  • ``char * c = "test"`` 是一个糟糕的 C 代码,它会产生警告:不推荐将字符串常量转换为 'char*' [-Wwrite-strings]。改用“const char*”。 (3认同)