繁体   English   中英

指向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}};

对我来说,它们是同一件事(使用各自类型初始化的指针数组),但显然不是。 那么到底有什么区别呢? 谢谢

编辑:如果对我的帖子投反对票的人会说为什么,这是一个不好的问题……那将是很棒的。

假设您在谈论C,那么区别是:

  • "hello"定义了一个字符数组
  • 数组可以衰减到指针

然而:

  • {1,2}没有定义一个int数组。 它指定了一个值列表,可用作int类型(或可转换)的字段的初始化程序。

int类似的情况是使用复合数组文字:

int *v[] = { (int[]){1,2}, (int[]){3,4} };

复合文字默认为可写的(与字符串文字不同),因此可以将v[0][0] = 5; ,您不能使用char版本。

虽然在某些情况下数组的名称确实会变成指针(例如, 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}};

字符串“ hello”(而所有用引号[“”]声明的字符串)的类型均为const char *,因此第一个成功,因为它使用两个char指针初始化了数组。 但是{1,2}的类型不是(int *),因此不会用于初始化int指针数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM