为什么 char*p="girls";正确,且跟 char p[]="girls";等价。 而 int q[4]={1,2,3,4};写
char p[]="girls";等价。
而 int q[4]={1,2,3,4};写成
int*q={1,2,3,4};就错了。
如果我改成int*q[4]能正确吗 展开
你的表述全错了!
char*p="girls";与char p[]="girls";并不等价:前者是“创建一个常字符串girls,并将这个常字符串的首地址(第一个字符的地址)赋给char *型指针p”;后者是“声明一个名为p的char型数组,并用字符串girls初始化。据此可知,前者的p是普通指针,可以指向别处,而它指向的字符串是常量,不得更改;后者的字符只是数组的内容,是可以更改的,但后者的p是数组名,属常指针,不能指向别处。
int q[4]={1,2,3,4};是声明一个名为q的数组,它有4个元素,并用等号右边的1,2,3,4等4个常数依次初始化数组q的元素q[0]、q[1]、q[2]、q[3],语法上要求右边的常数要用{}括起来。而int*q只是声明了一个int *型指针q,它只能由一个地址作右值来初始化或赋初值,显然等号右边的{1,2,3,4}不具备这种能力。写成int*q[4]也不行,这是声明了一个4个int *型指针元素的数组,得用4个地址来初始化。顺便说一句,计算机语言的语法只是一些规定,学习就得记住正确的写法和意思,有好多是讲不出为什么来的。比如前面提到的int*q={1,2,3,4};是错误的,那是因为C/C++没有提供这种写法并赋以正确意义,如果它提供了也就正确了,没有什么道理!
供参考……
2016-11-19
定义一个int类型的指针变量q , 后面 ={1,2,3,4} 这部分是想初始化它, 但是 int* q 不能这样初始化.
改为int* q[4] 更不对
应该这样:
int *q;
q=(int*)malloc(sizeof(int)*4);
或者:
int *q=new int[4];