Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
指向char的指针数组和指向int的指针数组之间的差异_C_Arrays_Pointers - Fatal编程技术网

指向char的指针数组和指向int的指针数组之间的差异

指向char的指针数组和指向int的指针数组之间的差异,c,arrays,pointers,C,Arrays,Pointers,这是一个C问题: 我不明白为什么这个代码会起作用: char *c[] = {"hello","world"}; 但事实并非如此: int *v[] = {{1,2},{3,4}}; 对我来说,它们是相同的东西(指针数组用各自的类型初始化),但显然不是。那么究竟有什么区别呢?塔克斯 编辑:如果否决我帖子的人可以说为什么这是一个糟糕的问题。。。那太好了。字符串“hello”(而不是用引号[“”]声明的所有字符串)是const char*类型,因此第一个字符串成功,因为它使用两个字符指针初始化数

这是一个C问题:

我不明白为什么这个代码会起作用:

char *c[] = {"hello","world"};
但事实并非如此:

int *v[] = {{1,2},{3,4}};
对我来说,它们是相同的东西(指针数组用各自的类型初始化),但显然不是。那么究竟有什么区别呢?塔克斯

编辑:如果否决我帖子的人可以说为什么这是一个糟糕的问题。。。那太好了。

字符串“hello”(而不是用引号[“”]声明的所有字符串)是const 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
一个区别是数组的内容可以在声明的同一行中用大括号
{}
初始化。指针的情况并非如此

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[]
可以用大括号
{}
初始化。但是,如果使用引号
”,则使用指针声明字符数组仍然可以

不允许使用下一行,因为您声明了一个指针变量,并且还试图用
{}
定义其内容,因为它是一个数组

int *v[] = {{1,2},{3,4}};
您应该改为使用此选项:

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

假设你说的是C,区别是:

  • “hello”
    定义一个字符数组
  • 数组可以衰减为指针
然而:

  • {1,2}
    未定义
    int
    s的数组。它指定了一组值,这些值可用作
    int
    (或可转换)类型字段的初始值设定项
int
的类似情况是使用复合数组文字:

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

复合文字默认为可写(与字符串文字不同),因此您可以转到
v[0][0]=5,这是不能用
char
版本执行的。

如果这是C/C++版本,就没有什么区别。我不会互换使用它们,但在数据方面它们是相同的。但是编译器用int-one向我显示警告,我不能访问单个元素。例如,v[0]{0]停止程序,不显示任何内容。最后一行没有编译。哎呀。我忘了编译器自己无法计算两个数组维度。现在应该可以了。好的,我知道了。但是{1,2}是什么类型那么?由于指针不是数组,我们不能使用聚合初始值设定项来填充内存。使用int a[2]={1,2}可以工作,因为数组是在堆栈上分配内存的,并且使用花括号来初始化数组,但是指针的行为不同。参考:如果{1,2}没有定义数组,为什么v[]={1,2}因为在声明中,数组的初始值可以由大括号括起来的列表指定。(大括号括起来的列表不是表达式)。声明中的
=
符号不是赋值运算符。