字符数组和整型数组的区别
difference between character array and integer array
char *s = "Hello"
char s[6] = "Hello"
以上任何一种语法都可以正常工作。
但是跟随呢?
int a[3] = {1,2,3}
(这会很好用)
- 但为什么不是这个,
int *a = {1, 2, 3};
?
解释以及案例 [2] 和 [4] 之间的比较会有所帮助。
因为"Hello"
被"The address of the string literal Hello"代替了。
所以 char *s = "Hello"
表示 "Assign to the pointer s
the address of the string literal Hello".
同时 {1, 2, 3}
不构成 地址 并且不会被替换。除了给指针分配地址外,你不能分配任何其他东西,所以你不能写 int *a = {1, 2, 3}
.
char *s="Hello"
这里,s
是指向char
的指针,指向字符串字面量"Hello"
.
的基地址
char s[6]="Hello"
这里 s
是一个 数组 的 6 char
s,有 H
, e
, l
、l
、o
和 [=22=]
作为初始值。
int a[3]={1,2,3}
此处,a
是一个包含 3 个元素的 int
数组,初始化值为 1
、2
和 3
。
注意:以上三个都是合法和有效.
int *a={1,2,3}
;无效。
此处,a
的类型为 int *
,括号内的 列表不提供 int *
的值。因此,这不是定义的行为并且无效。
用字符串初始化字符数组是一种特殊情况:char s[6] = "hello"
被视为代码是 char s[6] = { 'h', 'e', 'l', 'l', 'o', '[=11=]'};
。用字符串初始化字符数组是很常见的事情,所以这个习语是有道理的。
int *a = {1, 2, 3};
在语法上是错误的,因为 {1, 2, 3}
不能用于初始化指针。
但是,稍微修改一下就可以使它工作:
int *a = (int []){1, 2, 3};
这是一个 C99 复合文字。
这不起作用的原因是初始值的数据类型未定义。对于字符串文字,这是由语法隐式给出的。但是 { 1,2,3}
可以是数组、结构或许多其他变体。
您必须指定类型:
int *ia = (int []){1,2,3};
这使用复合文字 (C99)。
注意这不仅适用于初始化,也适用于普通代码。
案例4不支持而其他案例支持的原因是历史原因。这些因素是一些早期有影响力的程序员和编译器供应商之间的游说和政治相互作用,而不是经过深思熟虑的合理技术决策。
因此,如果您正在寻找可靠的技术依据,您将找不到。
从历史上看,案例 2 和案例 3 在 C 的发展早期就得到了支持。您的案例 2 达到了与
相同的效果
char s[6] = {'H', 'e', 'l', 'l', 'o', '[=10=]'};
除了 char
类型之外,没有字符串文字的对应物来初始化任何数组。
从历史上看,案例 1 是程序员为了达到
的效果而引入的异常
char s_temp[] = "Hello";
char *s = temp_s;
打字更少(即作为单个语句)。支持案例 1 的游说最终胜出(它被引入主流编译器,后来被引入标准)。情况 1 是标准中唯一可以使用数组初始化程序直接初始化指针而无需类型转换的情况。
从历史上看,程序员从未对案例 4 提出过要求或游说。
无论喜欢与否,这就是支持案例 1、2、3 而不支持案例 4 的原因。
案例 2 和案例 4 之间没有真正的比较,因为它们(寻求)实现不同的目标。与情况 2 一样,字符串文字是一个数组初始化器,它仅适用于 char
的数组 - 对于非 char
类型没有对应物。案例 4 尝试使用数组初始化程序初始化指针。
int a[3] = {1,2,3};
这是数组的正常初始化语法。
char s[6] = "Hello";
这是一个特殊情况初始化语法,仅适用于字符数组,您可以在右侧写一个字符串文字,它会扩展为上面的正常初始化语法, 即 char s[6] = {'H','e','l','l','o','[=12=]'};
char *s = "Hello";
这是标量变量的正常初始化语法,初始化为右侧的表达式。这里,"Hello"
是一个有效的 C 表达式。
int *a = {1, 2, 3};
这与上面的 (1) 不同之处在于 {1, 2, 3}
不是有效的 C 表达式。
char *s = "Hello"
char s[6] = "Hello"
以上任何一种语法都可以正常工作。
但是跟随呢?
int a[3] = {1,2,3}
(这会很好用)- 但为什么不是这个,
int *a = {1, 2, 3};
?
解释以及案例 [2] 和 [4] 之间的比较会有所帮助。
因为"Hello"
被"The address of the string literal Hello"代替了。
所以 char *s = "Hello"
表示 "Assign to the pointer s
the address of the string literal Hello".
同时 {1, 2, 3}
不构成 地址 并且不会被替换。除了给指针分配地址外,你不能分配任何其他东西,所以你不能写 int *a = {1, 2, 3}
.
char *s="Hello"
这里,
的基地址s
是指向char
的指针,指向字符串字面量"Hello"
.char s[6]="Hello"
这里
s
是一个 数组 的 6char
s,有H
,e
,l
、l
、o
和[=22=]
作为初始值。int a[3]={1,2,3}
此处,
a
是一个包含 3 个元素的int
数组,初始化值为1
、2
和3
。
注意:以上三个都是合法和有效.
int *a={1,2,3}
;无效。此处,
a
的类型为int *
,括号内的 列表不提供int *
的值。因此,这不是定义的行为并且无效。
用字符串初始化字符数组是一种特殊情况:char s[6] = "hello"
被视为代码是 char s[6] = { 'h', 'e', 'l', 'l', 'o', '[=11=]'};
。用字符串初始化字符数组是很常见的事情,所以这个习语是有道理的。
int *a = {1, 2, 3};
在语法上是错误的,因为 {1, 2, 3}
不能用于初始化指针。
但是,稍微修改一下就可以使它工作:
int *a = (int []){1, 2, 3};
这是一个 C99 复合文字。
这不起作用的原因是初始值的数据类型未定义。对于字符串文字,这是由语法隐式给出的。但是 { 1,2,3}
可以是数组、结构或许多其他变体。
您必须指定类型:
int *ia = (int []){1,2,3};
这使用复合文字 (C99)。
注意这不仅适用于初始化,也适用于普通代码。
案例4不支持而其他案例支持的原因是历史原因。这些因素是一些早期有影响力的程序员和编译器供应商之间的游说和政治相互作用,而不是经过深思熟虑的合理技术决策。
因此,如果您正在寻找可靠的技术依据,您将找不到。
从历史上看,案例 2 和案例 3 在 C 的发展早期就得到了支持。您的案例 2 达到了与
相同的效果 char s[6] = {'H', 'e', 'l', 'l', 'o', '[=10=]'};
除了 char
类型之外,没有字符串文字的对应物来初始化任何数组。
从历史上看,案例 1 是程序员为了达到
的效果而引入的异常 char s_temp[] = "Hello";
char *s = temp_s;
打字更少(即作为单个语句)。支持案例 1 的游说最终胜出(它被引入主流编译器,后来被引入标准)。情况 1 是标准中唯一可以使用数组初始化程序直接初始化指针而无需类型转换的情况。
从历史上看,程序员从未对案例 4 提出过要求或游说。
无论喜欢与否,这就是支持案例 1、2、3 而不支持案例 4 的原因。
案例 2 和案例 4 之间没有真正的比较,因为它们(寻求)实现不同的目标。与情况 2 一样,字符串文字是一个数组初始化器,它仅适用于 char
的数组 - 对于非 char
类型没有对应物。案例 4 尝试使用数组初始化程序初始化指针。
int a[3] = {1,2,3};
这是数组的正常初始化语法。
char s[6] = "Hello";
这是一个特殊情况初始化语法,仅适用于字符数组,您可以在右侧写一个字符串文字,它会扩展为上面的正常初始化语法, 即 char s[6] = {'H','e','l','l','o','[=12=]'};
char *s = "Hello";
这是标量变量的正常初始化语法,初始化为右侧的表达式。这里,"Hello"
是一个有效的 C 表达式。
int *a = {1, 2, 3};
这与上面的 (1) 不同之处在于 {1, 2, 3}
不是有效的 C 表达式。