字符数组,字符指针,Sizeof总结

1.以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写
  "abc",那么编译器帮你存储的是"abc\0"

2."abc"是常量吗?答案是有时是,有时不是。

  不是常量的情况:"abc"作为字符数组初始值的时候就不是,如
                  char str[] = "abc";
    因为定义的是一个字符数组,所以就相当于定义了一些空间来存放"abc",而又因为
    字符数组就是把字符一个一个地存放的,所以编译器把这个语句解析为
    char str[3] = {'a','b','c'};
                  又根据上面的总结1,所以char str[] = "abc";的最终结果是
    char str[4] = {'a','b','c','\0'};
    做一下扩展,如果char str[] = "abc";是在函数内部写的话,那么这里
    的"abc\0"因为不是常量,所以应该被放在栈上。
 
  是常量的情况:  把"abc"赋给一个字符指针变量时,如
                  char* ptr = "abc";
    因为定义的是一个普通指针,并没有定义空间来存放"abc",所以编译器得帮我们
    找地方来放"abc",显然,把这里的"abc"当成常量并把它放到程序的常量区是编译器
    最合适的选择。所以尽管ptr的类型不是const char*,并且ptr[0] = 'x';也能编译
    通过,但是执行ptr[0] = 'x';就会发生运行时异常,因为这个语句试图去修改程序
    常量区中的东西。
    记得哪本书中曾经说过char* ptr = "abc";这种写法原来在c++标准中是不允许的,
    但是因为这种写法在c中实在是太多了,为了兼容c,不允许也得允许。虽然允许,
    但是建议的写法应该是const char* ptr = "abc";这样如果后面写ptr[0] = 'x'的
    话编译器就不会让它编译通过,也就避免了上面说的运行时异常。
    又扩展一下,如果char* ptr = "abc";写在函数体内,那么虽然这里的"abc\0"被
    放在常量区中,但是ptr本身只是一个普通的指针变量,所以ptr是被放在栈上的,
    只不过是它所指向的东西被放在常量区罢了。

3.数组的类型是由该数组所存放的东西的类型以及数组本身的大小决定的。
  如char s1[3]和char s2[4],s1的类型就是char[3],s2的类型就是char[4],
  也就是说尽管s1和s2都是字符数组,但两者的类型却是不同的。

4.字符串常量的类型可以理解为相应字符常量数组的类型,
  如"abcdef"的类型就可以看成是const char[7]

5.sizeof是用来求类型的字节数的。如int a;那么无论sizeof(int)或者是sizeof(a)都
  是等于4,因为sizeof(a)其实就是sizeof(type of a)

6.对于函数参数列表中的以数组类型书写的形式参数,编译器把其解释为普通
  的指针类型,如对于void func(char sa[100],int ia[20],char *p)
  则sa的类型为char*,ia的类型为int*,p的类型为char*


7.根据上面的总结,来实战一下:
  对于char str[] = "abcdef";就有sizeof(str) == 7,因为str的类型是char[7],
  也有sizeof("abcdef") == 7,因为"abcdef"的类型是const char[7]。
  对于char *ptr = "abcdef";就有sizeof(ptr) == 4,因为ptr的类型是char*。
  对于char str2[10] = "abcdef";就有sizeof(str2) == 10,因为str2的类型是char[10]。
  对于void func(char sa[100],int ia[20],char *p);
  就有sizeof(sa) == sizeof(ia) == sizeof(p) == 4,
  因为sa的类型是char*,ia的类型是int*,p的类型是char*。

posted on 2006-05-09 21:14 Jeff 阅读(5545) 评论(7) 编辑 收藏

评论

#1楼 2007-04-19 20:36 savvystone[未注册用户]

总结的太棒了,顶一个  回复 引用   

#2楼 2007-09-06 14:40 patrick[未注册用户]

谢谢  回复 引用   

#3楼 2007-11-24 15:14 未注册[未注册用户]

帮助很大,谢谢  回复 引用   

#4楼 2008-03-12 21:06 conglibing[未注册用户]

太感谢了,这样的总结和文章,对我帮助非常大!  回复 引用   

#5楼 2008-11-17 21:46 austin0775[未注册用户]

good!
thanks
 回复 引用   

#6楼 2009-03-13 09:36 pcap[未注册用户]

写的实在是好!!谢谢!  回复 引用   

#7楼 2011-10-22 10:58 唔[未注册用户]

谢谢谢谢,这个问题一直不是很清楚,
写的很好!!!赞
 回复 引用   

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 395535 V4fh7k0aJtA=

公告

JeffChen

软件工程师

昵称:Jeff
园龄:6年1个月
粉丝:5
关注:0

导航

<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

统计

  • 随笔 - 136
  • 文章 - 1
  • 评论 - 219
  • 引用 - 1

常用链接

最新随笔

我的标签

随笔分类(125)

随笔档案(136)

文章档案(1)

技术网站

同学朋友

专业同仁

积分与排名

  • 积分 - 141034
  • 排名 - 677

最新评论

阅读排行榜

评论排行榜