首页 科技 军事 财经 教育 体育 房产 健康 汽车 安全 热点 人才 推选

推选

旗下栏目:

深入 理解char char a[ ]a[] 的区别@慕课网 原创_慕课网_手记

发布时间:2019-08-25 来源:原创/投稿/转载 作者:admin 人气:

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

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

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

  当编译器遇到这句时,会把str数组中从第一个元素把hello world\0 逐个填入。。

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

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

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

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

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

  C语言中操作字符串是通过它在内存中的存储单元的首******进行的,这是字符串的终极本质。。。

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

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

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

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

  而定义 char *s 时, 这是个指针变量,只占四个字节,32位,用来保存一个******。。

  当然是4了,编译器分配4个字节32位的空间,这个空间中将要保存******。。。

  用一句话来概括,就是 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 *的******,关于二级指针就在这里不详细讨论了 ,简单的说一下二级指针的易错点。

责任编辑:admin