对于char *s1 和 char s2[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误。

char *s1 = "hello"; char s2[] = "hello";

【区别所在】

char *s1 的s1,而指针是指向一块内存区域,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。 char s2[]的s2 是数组对应着一块内存区域,其地址和容量在生命期里不会改变,只有数组的内容可以改变

【内存模型】        +-----+     +---+---+---+---+---+---+    s1: |  *======> | h | e | l | l | o |\0 |        +-----+     +---+---+---+---+---+---+        +---+---+---+---+---+---+    s2: | h | e | l | l | o |\0 |        +---+---+---+---+---+---+

场景一) char *s1 = "hello"; char s2[] = "hello"; s2=s1;  //编译ERROR s1=s2;  //OK

分析:s2其地址和容量在生命期里不能改变

场景二) char s2[] = "hello"; char *s1 = s2;  //编译器做了隐式的转换 实际为&s2 或 char *s1 = &s2;

分析:以上两个指针复值完全等价,由于编译器会做这个隐式转换也容易导致初学者误认为 char *s 与char s[]是一回事。       另用第二种在一些编译器甚至会报警告信息。

场景三) char *s1 = "hello"; char s2[] = "hello"; s1[0]='a';  //×运行ERROR( 这一句好像在一些的编译器不会出错,原因待查) s2[0]='a';  //OK

分析:运行时会报错,原因在于企图改变s1的内容,由于s1指向的是常量字符串,其内容是不可修改的,因此在运行时不会通过。而s2指向的是变量区字符串,可以修改。

场景四) 让我们来给一个指针的指针赋值,在使用某些含char**参数的函数时会用到,场景二的增强版。     char *s1="hello";     char s2[]="hello";     char *s3=s2;       //★注意这句必须要★     char **s4=&s3;   //s2(char[])要用两步才能完成赋值     char **s5=&s1;   //s1(char*) 只需一步     printf("s4=[%s]\n",*s4);//打印结果:s4=[hello]     printf("s5=[%s]\n",*s5);//打印结果:s5=[hello]

分析:这个例子应当说最能反映出char *与char []的差异,但是由于使用场合不多,新人尤其需要注意。

下面是一些char *s1 和 char s2[]相同的地方(同样编译器对char[]做了隐式变化): 1)作为形参完全相同 如:    void function(char *s1);    void function(char s1[]);

2)只读取不修改的时候 如:     char *s1="hello";     char s2[]="hello";     printf("s1[1]=[%c]\n",s1[1]);   //s1[1]=[e]     printf("s2[1]=[%c]\n",s2[1]);   //s2[1]=[e]     printf("s1=[%s]\n",s1);         //s1=[hello]     printf("s2=[%s]\n",s2);         //s2=[hello]

对于char *s1 和 char s2[] 的认识的更多相关文章

  1. char *c和char c[]区别

    char *c和char c[]区别 问题引入:在实习过程中发现了一个以前一直默认的错误,同样char *c = "abc"和char c[]="abc",前者 ...

  2. C语言中strcpy(char *strDest, const char *strScr)字符串复制库函数的理解与分析

    1.原版的strcpy()函数原型 char * strcpy( char *strDest, const char *strSrc ) { assert( (strDest != NULL) &am ...

  3. 数组字符串与指针字符串的区别 char s[]="***" 和char *s="***"的区别

    char s[] = "wangshihui"; char *s = "wangshihui"; 皆宣告了s字符串,在C-style string的函数皆可使用 ...

  4. char a[]和char *a的比较

    指针和数组存在着一些本质的区别.当然,在某种情况下,比如数组作为函数的参数进行传递时,由于该数组自动退化为同类型的指针,所以在函数内部,作 为函数参数传递进来的指针与数组确实具有一定的一致性,但这只是 ...

  5. C++ code:char pointers and char arrays(字符指针与字符数组)

    C-串的正确赋值.复制.修改.比较.连接等方式. #include<iostream> #pragma warning(disable: 4996)//这一句是为了解决“strrev”出现 ...

  6. char *s 和 char s[] 的区别

    最近的项目中有不少c的程序,在与项目新成员的交流中发现,普遍对于char *s1 和 char s2[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误.一时也不能说得很明白,网上也搜了一下 ...

  7. 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p

    由于没有const*运算,const实际上修饰的是前面的char*,但不能在定义时转换写成 const(char *)*p,因为在定义是"()"是表示函数. 三.深入理解7种组合 ...

  8. char *s 和char s[]的区别

    char *s 和 char s[] 的区别小结 博客分类: C语言 c教育 . 最近的项目中有不少c的程序,在与项目新成员的交流中发现,普遍对于char *s1 和 char s2[] 认识有误区( ...

  9. C++中 char *s 和 char s[] 的区别

    原因 刚好看到给main传递参数,书上(C++Primer)说“ int main(int argc, char *argv[])也可以写成 int main(int argc, char **arg ...

随机推荐

  1. 对接京东jos遇到的坑 记录一下。方便查询

    坑很多,有一些忘记了.文档乱的很,有问题可以私信我一下我看能不能想起来. 坑一.添加商品接口. {"error_response": {"code":" ...

  2. Go语言包管理工具Glide

      Go语言包管理工具用于管理Go项目的库和库的依赖引用. 包管理工具普遍会在Go项目根目录生成Vendor文件夹并自动下载该Go项目需要的库. Go语言有很多开源的包管理工具,这里主要介绍Glide ...

  3. (转)Python random模块

    原文:https://my.oschina.net/cuffica/blog/33336 https://www.cnblogs.com/renpingsheng/p/7105296.html ran ...

  4. Cookie跳转登录验证码

    对于web应用来说,大部分的系统在用户登录时都要求用户输入验证码,验证码的类型的很多,有字母数字的,有汉字的,甚至还要用户输入一条算术题的答案的, 对于系统来说使用验证码可以有效果的防止采用机器猜测方 ...

  5. Linux定时增量更新文件--转

    http://my.oschina.net/immk/blog/193926 动机与需求:现在有两台服务器A和B,由于A的存储随时会挂(某些原因),所以需要B机器上有A的备份,并且能够与A同步更新 一 ...

  6. 6.006 Introduction to Algorithms

    课程信息 6.006 Introduction to Algorithms

  7. SSM批量插入和修改实现实例

    1.Service,自己对代码逻辑进行相应处理 /* 新增订单产品信息 */ List<DmsOrderProduct> insertOrderProductList = Lists.ne ...

  8. Vue父子组件生命周期执行顺序及钩子函数的个人理解

    先附一张官网上的vue实例的生命周期图,每个Vue实例在被创建的时候都需要经过一系列的初始化过程,例如需要设置数据监听,编译模板,将实例挂载到DOM并在数据变化时更新DOM等.同时在这个过程中也会运行 ...

  9. 一个Json、数组、Dictionary转换和数组对比的C#实例

    最近做了一个程序,里面一段代码用到Json.数组.Dictionary转换和数组对比的一些知识,虽然在实际碰到类似问题时候有更好的方法,但这就当是一次基础知识的回顾,现在分享一下. 先介绍下要实现的业 ...

  10. Tips——App启动速度的优化与监控

    一.App的启动模式 冷启动:App点击启动前,它的进程不在系统里,需要系统新创建一个进程分配给它启动的情况.这是一次完整的启动过程. 热启动:App在冷启动后用户将App退后台,在App的进程还在系 ...