字符数组,字符指针,字符串常量以及其sizeof的一些总结

转载:http://www.cppblog.com/pwqonline/archive/2009/03/01/75269.html

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]

也就是说尽管s1s2都是字符数组,但两者的类型却是不同的。

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的类型为intp的类型为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]。---数组名在sizeof中不退化为指针,在strlen中退化为指针

对于void func(char sa[100],int ia[20],char *p);--------

就有sizeof(sa) == sizeof(ia) == sizeof(p) == 4,因为sa的类型是char,ia的类型是int,p的类型是char*。---数组名在作为函数参数时,退化为指针,函数只传数组的首地址,并不知道数组的大小,所以sizeof为4



注意sizeof(数组名)在以上两种情况下的区别









原文链接: https://www.cnblogs.com/jmzz/archive/2011/09/18/2180733.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/32500

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午9:44
下一篇 2023年2月8日 上午9:45

相关推荐