一、本质区别

  char* s是一个保存字符串首地址的指针变量,char a[]是许多连续的内存单元,单元中的元素为char类型。之所以用char *能达到char []的效果,还是字符串的本质,即给你一个字符串地址,便可以随心所欲的操作它。但是,char*和char a[]的本质属性是不一样的。

  当定义 char a[10] 时,编译器会给数组分配十个单元,每个单元的数据类型为字符。而定义 char* s 时,这是个指针变量,只占四个字节,32位,用来保存一个地址,如:

  printf("%p",s);//这个表示 s 的单元中所保存的地址。

  printf("%p",&s);//这个表示变量本身所在内存单元地址。

二、具体分析

例1:

  char *s1 = "hello";

  char s2[100] = "hello";

  //s1指向的内存区域可以改变,而且指向常量字符串时,它的内容是不可以被部分修改的(不能以s1[x]='y'的形式修改,可以以s1[x]的形式来使用,跟数组一样;但整体可以修改,如s1=“dasdasd”就可以)。

  //s2指向的内存区域的地址和容量在生命期里不会改变,但数组里存的内容可以改变。(两者在内存里都在末位存了‘\0’,但strlen()时不计‘\0’。上述s1,s2的strlen()都是5)

  s2=s1;

  //错,s2的地址不能变,即数组不能用等号赋值(除了初始化)

  s1=s2;//对,相当于普通的非数组变量赋值

例2:

   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]

例3:

  char  str[10] = {"hello world"};

  printf("%s",str);  //用首地址就可以输出字符串,因为在C语言中字符串常量的本质表示其实是一个地址

char  *s ;

s = "hello";

  把一个字符串赋给一个指针变量居然没出错,这是因为c语言中编译器会给字符串常量分配地址,字符串常量的本质表示其实是一个地址。如果"hello"存储在内存中的 0x2000 0x2001 0x2002 0x2003 0x2004 0x2005 。

s = "hello" ,就是把“hello”的首地址给了s,其实真正的意义是 s ="hello" = 0x2000;

我们将“hello”看作是字符串,但是编译器把它看作是地址 0x2000,即字符串常量的本质表现是代表它的第一个字符的地址。

那么 %s ,它的原理其实也是通过字符串首地址输出字符串,printf("%s ", s);   所以,printf("%s",地址);也是等效的。

最新文章

  1. sublime快捷键<转>
  2. LAMP php5.4编译
  3. Windows文件操作的API函数[转载]
  4. Oracle12C 怎样导入scott用户
  5. Sass与Compass——回顾
  6. CodeForces - 796B 模拟
  7. 《CLR via C#》读书笔记(一)——CLR的执行模式
  8. 面试题: 多个 await 处理,有一个失败,就算作失败
  9. Jenkins - SSH认证方式拉取Git代码
  10. RHCE基础环境系统的搭建
  11. react 15.5版本的警告问题
  12. scrapy python2升级python3遇到的坑
  13. Linux下网络文件系统NFS服务搭建易错点总结
  14. ethereum/EIPs-1078 Universal login / signup using ENS subdomains
  15. 从boost到Adaboost再到GBRT-GBDT-MART
  16. 20155325 2016-2017-2 《Java程序设计》第8周学习总结
  17. csc.exe已退出,代码为-532462766
  18. SVN四部曲之SVN设置详解深入
  19. (一)C的编译,printf,规范化
  20. Swift-Debug下打印函数名和行数

热门文章

  1. C#.NET如何将cs文件编译成dll文件 exe文件 如何调用dll文件
  2. 操作系统——IO管理
  3. Linux下,PHP的SESSION不起作用的问题
  4. 开发人员调试工具Chrome Workspace
  5. css ios H5页面web页面 上下滑动卡顿问题解决方案
  6. 有banner的uid数, 有logo的uid数 , 交集数
  7. 【Dairy】2016.10.17-1 OIer最悲剧的事情
  8. Java 系统工具类 —— System、Scanner、Runtime
  9. luogu 2627 修建草坪
  10. BZOJ_3667_Rabin-Miller算法_Mille_Rabin+Pollard rho