设为首页 - 加入收藏
您的当前位置:主页 > 房产信息 > 本文地址:http://www.duitang.net.cn/fangchanxinxi/2019/4108.html

深入 理解char char char a[ ] char a[] 的区别

时间:2019-09-22 来源:(原创/投稿/转载) 编辑:联络员

  C语言中由于指针的灵活性,导致指针能代替数组使用,或者混合使用,这些导致了许多指针和数组的迷惑,因此,刻意再次深入探究了指针和数组这玩意儿,其他类型的数组比较简单,容易混淆的是字符数组和字符指针这两个。。。下面就开始剖析一下这两位的恩怨情仇。。。

  数组是多个元素的集合,在内存中分布在******相连的单元中,所以可以通过其下标访问不同单元的元素。。

  指针也是一种变量,只不过它的内存单元中保存的是一个标识其他位置的******。。由于******也是整数,在32位平台下,指针默认为32位。。

  由于C语言中没有真正的字符串类型,可以通过字符数组表示字符串,因为它的元素******是连续的,这就足够了。

  C语言中规定数组代表数组所在内存位置的首******,也是 str[0]的******,即str =

  因为还有一个关键,在C语言中字符串常量的本质表示其实是一个******,这是许多初学者比较难理解的问题。。。

  看清楚了吧 ,你把China 看作是字符串,但是编译器把它看作是****** 0x3000,即字符串常量的本质表现是代表它的第一个字符的******。。。。。。。。。。

  那么 %s ,它的原理其实也是通过字符串首******输出字符串,printf(%s , s); 传给它的其实是s所保存的字符串的******。。。

  前面说到 a代表字符串的首******,而s 这个指针也保存字符串的******(其实首******),即第一个字符的******,这个******单元中的数据是一个字符,

  C语言中数组名可以复制给指针表示******, 但是却不能赋给给数组名,它是一个常量类型,所以不能修改。。

  字符指针可以用 间接操作符 *取其内容,也可以用数组的下标形式[ ],数组名也可以用 *操作,因为它本身表示一个****** 。。

  当定义 char a[10 ] 时,编译器会给数组分配十个单元,每个单元的数据类型为字符。。

  用一句话来概括,就是 char *s 只是一个保存字符串首******的指针变量, char a[ ] 是许多连续的内存单元,单元中的元素为char ,之所以用 char *能达到

  char a [ ] 的效果,还是字符串的本质,******,即给你一个字符串******,便可以随心所欲的操所他。。但是,char* 和 char a[ ] 的本质属性是不一样的。。

  由于[ ] 的优先级高于* 所以a先和 [ ]结合,他还是一个数组,数组中的元素才是char * ,前面讲到char * 是一个变量,保存的******。。

  同过这句可以看到, 数组中的元素是字符串,那么sizeof(a) 是多少呢,有人会想到是五个单词的占内存中的全部字节数 6+7+8+7 = 28;

  为什么,前面已经说到, 字符串常量的本质是******,a 数组中的元素为char * 指针,指针变量占四个字节,那么四个元素就是16个字节了

  可以看到数组中的四个元素保存了四个内存******,这四个******中就代表了四个字符串的首******,而不是字符串本身。。。

  可以看到 0012FF38 0012FF3C 0012FF40 0012FF44,这四个是元素单元所在的******,每个******相差四个字节,这是由于每个元素是一个指针变量占四个字节。。。

  char **为二级指针, s保存一级指针 char *的******,关于二级指针就在这里不详细讨论了 ,简单的说一下二级指针的易错点。

  为什么能把 a赋给s,因为数组名a代表数组元素内存单元的首******,即 a = &a[0] = 0012FF38;

  虽然都是******, 但是指向的类型不一样,因此,不能这样用。,从其本质来分析,hello world,代表一个******,比如0x003001,这个******中的内容是 h

  ,为 char 型,而 s 也保存一个****** ,这个******中的内容(*s) 是char *,是一个指针类型,所以两者类型是不一样的。。。

  s 变量中保存的是一个无效随机不可用的******, 谁也不知道它指向哪里。。。。,*s 操作会崩溃。。

栏目分类

本网转载作品的目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。

如涉及作品内容、版权等问题,请联系我们进行修改或删除!联系我们-

Top