char *x[4] = { "ffg", "fgf", "kkk" "mmm"};
int *x1[4] = { 1, 2 ,3 , 4};
如果我创建字符指针的阵列上方其编译细而如果我创建整数指针阵列中第二行中提到我正在错误创建字符指针阵列和整数指针
'initializing' : cannot convert from 'int' to 'int *'
如所提到的
语法对于字符的工作方式如何,但不适用于整数。请解释任何人。
char *x[4] = { "ffg", "fgf", "kkk" "mmm"};
int *x1[4] = { 1, 2 ,3 , 4};
如果我创建字符指针的阵列上方其编译细而如果我创建整数指针阵列中第二行中提到我正在错误创建字符指针阵列和整数指针
'initializing' : cannot convert from 'int' to 'int *'
如所提到的
语法对于字符的工作方式如何,但不适用于整数。请解释任何人。
"ffg"
具有类型char*
,而1
具有类型int
(不int*
)。希望你现在看到这个问题。
:好的,从技术上来说it's char[4]
in C,但是这暗含地衰变为char*
。在C++中,类型为const char[4]
,您应该使用get a warning or an error from the compiler。
我被控制''ffg“'有'const char'[4]' – juanchopanza
@juanchopanza:我确定有人会跳进来纠正,但是你超级快。 :)让我想一想,如何在不增加混淆的情况下对其进行重新说明。 – NPE
在[]用于数组访问的上下文中使用[1]进行脚注是不必要的混淆 - 将您的笔记内嵌或者只是在没有注脚的情况下进行注释。 –
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]
。
字符串文字是否存储在只读存储器中取决于实现。 –
@ShafikYaghmour - 谢谢澄清:) – Sadique
int *x1[4] = { 1, 2 ,3 , 4};
你不能做到这一点,你存储整数,而不是整数的指针,存储整数指针数组中这里是如何PROCEDE:
int *x1[4] ;
int i , j , k , l;
x1[0] = &i;
x1[1] = &j;
x1[2] = &k;
x1[3] = &l;
@EricB没有理由相信该数组的范围比整数大。 – juanchopanza
没有什么错指针数组。 我认为你不明白编译器告诉你什么。
语法没有问题。这是语义不好。
{1, 2, 3, 4}
有int[4]
类型,但是您将它指定为int*[4]
,这是不可能的。
错误是一个initializing
错误。它告诉你解析器对你的代码是可以的,但语义分析器并不是因为int
与int*
不一样。
要增加混淆,如果使用不同的文字(即零)初始化整数指针数组,它将“工作”。这是因为零也转换为指针。你实际上是否有一个整数指针数组(即你打算做什么)? – Damon
恩,你的语法不适合人物。字符版本是'char * x [4] = {'f','f','g'};',并且这与'int'版本有相同的问题。 –