1
char *x[4] = { "ffg", "fgf", "kkk" "mmm"};
int *x1[4] = { 1, 2 ,3 , 4};

如果我创建如上所述的字符指针数组,它的编译很好,而如果我创建第二行中提到的整数指针数组,我会收到错误

'initializing' : cannot convert from 'int' to 'int *'

语法如何适用于字符但不适用于整数。请解释任何人。

4

4 回答 4

10

"ffg"具有类型char* 1,而1具有类型int( not int* )。希望你现在看到这个问题。

1:嗯,从技术上讲,它char[4]在 C 中,但隐含地衰减为char*. 在 C++ 中,类型是const char[4],您应该从编译器收到警告或错误

于 2013-10-23T13:46:02.493 回答
3

int *x1[4] = { 1, 2 ,3 , 4};你不能这样做,你存储整数而不是整数指针,将整数指针存储在你的数组中,这是如何进行的:

int *x1[4] ;
int i , j , k , l;
x1[0] = &i;
x1[1] = &j;
x1[2] = &k;
x1[3] = &l;
于 2013-10-23T13:49:53.740 回答
2

1, 2 ,3 , 4是整数而不是指向ints. 你可能想做。像这样铸造:

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

将使错误消失,但取消引用将导致 UB。

int i1=0, i2=0, i3=0, i4=0;
int *x1[4] = { &i1, &i2, &i3, &i4 };

字符串文字(如"ffg","fgf"等)保存在只读位置(取决于实现)并具有char [].

由于您标记了 C++,您可以尝试:

#include <iostream>
#include <typeinfo>

int main()
{
    char arr [5] = "test";
    char *arr1 = "test";
    std::cout << typeid(arr).name() << std::endl;
    std::cout << typeid("test").name() << std::endl;
    std::cout << typeid(arr1).name() << std::endl;
}

输出:

A5_c
A5_c
Pc

如您所见,字符串文字衰减为 NPE 所说的指针,尽管它的类型是char[5].

于 2013-10-23T13:46:31.387 回答
0

指针数组没有错。我认为您无法理解编译器告诉您的内容。

语法没有错。不好的是语义。

{1, 2, 3, 4}有类型int[4],但你将它分配给一个int*[4],这是不可能的。

错误是initializing错误。它告诉您解析器对您的代码没问题,但语义分析器不是因为 anintint*.

于 2013-10-23T13:56:25.963 回答