返回首页

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

时间:2019-09-19 来源:原创/投稿/转载作者:管理员点击:

  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个字节了

【责任编辑:管理员】
随机推荐 更多>>