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',''}; //同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[] 的区别小结

原文地址:https://www.cnblogs.com/larryzeal/p/5586549.html