C/C++ int[] vs int*(指针与数组表示法).有什么区别
C/C++ int[] vs int* (pointers vs. array notation). What is the difference?
我知道 C 中的数组只是指向顺序存储数据的指针。但是差异意味着符号 [] 和 * 的差异。我的意思是在所有可能的使用环境中。例如:
char c[] = "test";
如果您在函数体中提供此指令,它将在堆栈上分配字符串,同时
char* c = "test";
将指向数据(只读(段。
您能否在所有使用上下文中列出这两种符号之间的所有差异,以形成清晰的总体视图。
根据 C99 标准:
数组类型描述连续分配的非空集具有特定成员对象类型的对象,称为元素类型。
- 数组类型的特点是其元素类型和数组中元素的数量。数组类型称为派生自其元素类型,如果其元素类型为
T
,则数组类型有时称为T
数组。数组的构造元素类型的类型称为数组类型派生。
指针类型可以派生自函数类型、对象类型或不完整的类型,称为引用类型。指针类型描述一个对象,其值提供对实体引用的类型。从引用的类型派生的指针类型
T
有时称为指向T
的指针。指针的构造引用类型中的类型称为指针类型派生。
根据标准声明
char s[] = "abc", t[3] = "abc";
char s[] = { 'a', 'b', 'c', ' ' }, t[] = { 'a', 'b', 'c' };
是相同的。数组的内容是可修改的。另一方面,宣言
const char *p = "abc";
将 P 定义为指向常量 char
的指针,并将其初始化为指向类型为 char
的常量数组 (以 C++ 为单位(且长度为 4 的对象,其元素使用字符串文本初始化。如果尝试使用 p
修改数组的内容,则行为是未定义的。
根据 6.3.2.1 数组下标取消引用和数组下标是相同的:
下标运算符
[]
的定义是E1[E2]
与(*((E1)+(E2)))
相同。
数组和指针的区别是:
- 指针后面没有内存大小的信息(没有便携式方法来获取它(
- 无法构造不完整类型的数组
- 指针类型可能派生自不完整的类型
- 指针可以定义递归结构(这是前两个的结果(
有关该主题的更多有用信息,请访问 http://www.cplusplus.com/forum/articles/9/
char c[] = "test";
这将创建一个包含字符串测试的数组,以便您可以修改/更改任何字符,例如
c[2] = 'p';
但
char * c = "test"
它是一个字符串文字 - 它是一个常量字符.
因此,对这个字符串文字进行任何修改都会给我们带来段错误。所以
c[2] = 'p';
现在是非法的,给了我们段错误。
char []
表示类型"未知字符边界数组",而char *
表示类型"指向字符的指针"。 正如您所观察到的,当类型为"未知字符边界数组"的变量的定义使用字符串文字初始化时,该类型将转换为"char 数组[N]",其中 N 是适当的大小。 这同样适用于从数组聚合初始化:
int arr[] = { 0, 1, 2 };
arr 被转换为 "int 的数组[3] 类型"。
在用户定义的类型定义(struct
、class
或union
(中,未知绑定类型的数组在C++中是被禁止的,尽管在某些版本的C中,它们被允许作为结构的最后一个成员,在那里它们可以用来访问结构末尾之后的分配内存;这种用法被称为"灵活数组"。
递归类型构造是另一个区别;可以构造指向char *
的指针和数组(例如 char **
, char (*)[10]
(,但这对于未知边界的数组是非法的;一个人不能写char []*
或char [][10]
(尽管char (*)[]
和char [10][]
都很好(。
最后,cv-qualififing的操作方式不同;给定typedef char *ptr_to_char
和typedef char array_of_unknown_bound_of_char[]
,cv限定指针版本的行为将按预期,而cv限定数组版本会将cv限定迁移到元素类型:也就是说,const array_of_unknown_bound_of_char
等同于const char []
而不是虚构的char (const) []
。 这意味着在函数定义中,数组到指针衰减在构造原型之前对参数进行操作,
void foo (int const a[]) {
a = 0;
}
是合法的;没有办法使未知绑定参数数组不可修改。
如果您知道声明指针变量不会创建它指向的变量类型,那么整个事情就会变得清晰起来。它创建一个指针变量。
因此,在实践中,如果您需要一个字符串,则需要指定一个字符数组,并且稍后可以使用指针。
实际上数组等效于常量指针。
此外,char c[] 为数组分配内存,其基址为 c 本身。没有为存储该地址分配单独的内存。
写入 char *c 为基址存储在 c 中的字符串分配内存。此外,使用单独的内存位置来存储 c。
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 使用 int 表示浮点除法 C++
- 是否可以保证按字节的零 int 是零的表示形式?
- 使用 int 指针的浮点数的位表示形式
- 如何检查 int 变量是否包含合法(非陷阱表示)值?
- 为表示一个或多个操作的C++函数的int参数寻找类型安全的替换
- 运行时错误:有符号整数溢出:964632435 * 10 无法在类型 'int' 中表示
- 在二进制表示中将二进制 std::string 转换为 int
- 由INT数据类型(低,高)结构表示的双数据类型
- 表示给定"int"的最小位数
- 为什么不能将 int(表示 ASCII 字符)转换为 std::字符串,而没有大括号环绕在 int 周围?
- 使用inet_pton()获取IPv4地址的无符号int表示形式
- 使用向量<对<字符串,int > >表示哈希表
- C/C++ int[] vs int*(指针与数组表示法).有什么区别
- 查找存储在长位中的最后一个int(1-9)(每个int由4位表示)
- c++帮助设计类ConstArray和Array,它们表示一种int值的动态数组
- 将 int 的所有字节设置为(无符号字符)0,保证表示零
- x[0] == 1 在 C++11 中表示 1 个常量表达式,当 x 是常量 int[]
- 在c++中将N位int表示为十六进制
- 将char数组转换为int表示