指向char的指针数组和指向int的指针数组之间的区别
Difference between array of pointers to char and array of pointers to int
这是一道C题:
我不明白为什么这段代码有效:
char *c[] = {"hello","world"};
但这不是:
int *v[] = {{1,2},{3,4}};
对我来说它们是相同的东西(用它们各自的类型初始化的指针数组)但显然它们不是。那么到底有什么区别呢?谢谢
编辑:如果对我的post投反对票的人能说出为什么这是一个糟糕的问题……那就太好了。
字符串 "hello"(而不是所有用引号 [""] 声明的字符串)属于 const char* 类型,因此第一个成功,因为它使用两个 char 指针初始化数组。
但是 {1,2} 不是 (int *) 类型,因此它不会用于初始化 int 指针数组。
虽然数组的名称在某些上下文中确实会衰减为指针(例如 myArray[5]
实际上只是 *(myArray + 5)
的另一种说法),但数组和指针在C语言。
一个区别是数组的内容可以在声明它们的同一行中用花括号 { }
初始化。指针不是这样。
int a[] = {1,2,3}; // this is okay
int* p = {7,8,9}; // this isn't
另一个区别是指针变量可以修改,而数组名指向的地址是固定的。
char* p = "hello";
char a[] = "hello";
a = a + 2; // this is fine
a++; // this is fine too
b = b + 2; // these will cause the compiler to complain
b++;
尽管存在这些差异,但将数组的地址分配给指针变量是完全合法的——事实上,这就是将数组传递给函数时所做的事情。
int a[] = {234,0,-23,34,3};
int* p = a; // this is okay
下一行是合法的,因为您正在定义一个字符指针数组。数组c[]
可以用大括号{ }
初始化。但是如果使用引号 " "
.
,用指针声明字符数组仍然没问题
char *c[] = {"hello","world"};
不允许下一行,因为您声明了一个指针变量并且还试图用 { }
定义它的内容,因为它是一个数组。
int *v[] = {{1,2},{3,4}};
你应该改用这个:
int v[][2] = {{1,2},{3,4}};
假设你说的是 C,区别是:
"hello"
定义了一个字符数组
- 数组可以退化为指针
但是:
{1,2}
没有定义 int
的数组。它指定了一个值列表,这些值可用作 int
(或可转换)类型字段的初始值设定项。
int
的类似情况是使用复合数组文字:
int *v[] = { (int[]){1,2}, (int[]){3,4} };
复合文字默认为可写(与字符串文字不同),因此您可以使用 v[0][0] = 5;
,这是 char
版本无法做到的。
这是一道C题:
我不明白为什么这段代码有效:
char *c[] = {"hello","world"};
但这不是:
int *v[] = {{1,2},{3,4}};
对我来说它们是相同的东西(用它们各自的类型初始化的指针数组)但显然它们不是。那么到底有什么区别呢?谢谢
编辑:如果对我的post投反对票的人能说出为什么这是一个糟糕的问题……那就太好了。
字符串 "hello"(而不是所有用引号 [""] 声明的字符串)属于 const char* 类型,因此第一个成功,因为它使用两个 char 指针初始化数组。 但是 {1,2} 不是 (int *) 类型,因此它不会用于初始化 int 指针数组。
虽然数组的名称在某些上下文中确实会衰减为指针(例如 myArray[5]
实际上只是 *(myArray + 5)
的另一种说法),但数组和指针在C语言。
一个区别是数组的内容可以在声明它们的同一行中用花括号 { }
初始化。指针不是这样。
int a[] = {1,2,3}; // this is okay
int* p = {7,8,9}; // this isn't
另一个区别是指针变量可以修改,而数组名指向的地址是固定的。
char* p = "hello";
char a[] = "hello";
a = a + 2; // this is fine
a++; // this is fine too
b = b + 2; // these will cause the compiler to complain
b++;
尽管存在这些差异,但将数组的地址分配给指针变量是完全合法的——事实上,这就是将数组传递给函数时所做的事情。
int a[] = {234,0,-23,34,3};
int* p = a; // this is okay
下一行是合法的,因为您正在定义一个字符指针数组。数组c[]
可以用大括号{ }
初始化。但是如果使用引号 " "
.
char *c[] = {"hello","world"};
不允许下一行,因为您声明了一个指针变量并且还试图用 { }
定义它的内容,因为它是一个数组。
int *v[] = {{1,2},{3,4}};
你应该改用这个:
int v[][2] = {{1,2},{3,4}};
假设你说的是 C,区别是:
"hello"
定义了一个字符数组- 数组可以退化为指针
但是:
{1,2}
没有定义int
的数组。它指定了一个值列表,这些值可用作int
(或可转换)类型字段的初始值设定项。
int
的类似情况是使用复合数组文字:
int *v[] = { (int[]){1,2}, (int[]){3,4} };
复合文字默认为可写(与字符串文字不同),因此您可以使用 v[0][0] = 5;
,这是 char
版本无法做到的。