C++中 char *s 和 char s[] 的区别
原因
刚好看到给main传递参数,书上(C++Primer)说“ int main(int argc, char *argv[])也可以写成 int main(int argc, char **argv),argv 是 C风格字符串数组 ”。
然后各种别扭,感觉有什么没弄明白(最怕这样,不知道自己不知道什么)。
于是敲敲写写,当敲到 char c='x'; char *pc=&c; 的时候突然回过神来,原来char **argv=&pc; 的时候,argv 可不是 C风格字符串数组 !
char **argv 直接理解的话就是char 指针的指针,跟 C风格字符串数组 未必完全一致!
就是说,如果是char **argv ,那我完全可以传入上面的argv(&pc),那编译器会怎么处理?
char *s1 = "abc"; // 指向字符串字面值常量的指针,常量不可修改,所以其实是const char *s1 。疑问:const怎么能赋值给非const? char s2[] = "abc"; // 数组!内容可变,但地址及长度不可变,所以其实是char *const s22=&s2。 char *const s22=s2; // char *const s23=&s2; //被禁止了 char s3[]={'a','b','c','\0'}; //同s2! char *const s23=s3; // s3=s2; //数组名,底层被转成指针,而且是char *const 的指针 // s1[0]='x'; //无响应 s2[0]='x'; //OK s3[0]='x';
猜测
底层会添加一些内容,从而保证const正确???
其他
定义指向数组的指针(非数组名或者数组第一个元素,而是其指针的指针)
char cs4[] = "abc"; char *cs44 = cs4; char **cs444 = &cs44; //必须这么间接定义?
乱语
C++定义了一堆术语,又给每个术语及其基本组合都规定了一些基础的逻辑,然后任由发挥。。。
虽然高工会很爽,但新人期间会很惨!极容易因为想不到某些逻辑而抓狂。
够低级(底层吧。。)
贴个好文章 char *s 和 char s[] 的区别小结