zoukankan      html  css  js  c++  java
  • 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[] 的区别小结

  • 相关阅读:
    2019-8-31-win10-uwp-使用-WinDbg-调试
    PHP simplexml_import_dom() 函数
    PHP asXML() 函数
    PHP registerXPathNamespace() 函数
    PHP getNamespaces() 函数
    PHP getName() 函数
    查看收集统计信息的时间间隔
    SPOJ DISQUERY LCA + 倍增
    洛谷P3958 奶酪 并查集
    洛谷P2678 跳石头
  • 原文地址:https://www.cnblogs.com/larryzeal/p/5586549.html
Copyright © 2011-2022 走看看