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*,如下面是常见的笔试题目:
sizeof (str ) = ?(1)
void Foo ( char str[100]){
请计算
sizeof( str ) = ?(4)
}
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*。
分享到:
相关推荐
字符数组字符指针sizeofstrlen的一点总结
字符数组与字符指针这两个概念在C/C++中非常重要,编程时会经常使用到,但是很多人容易错误使用!两者有相同地方,也要不同地方,本文详细介绍了两者的区别,能给读者一定的参考!
字符串指针字符串指针与字符数组的区别与字符数组的区别 转载
//------------------------------------------------------------------------- } void print_char(char* array[],int len)//当调用的时候传递进来的不是数组,而是字符指针他每加1也就是加上sizeof(char*)的...
C语言用指针将字符串数组位置颠倒,实现ABCDEFGHIJKLMNOPQRSTUVWXYZ转换成ZYXWVUTSRQPONNOPQRSTUVWXYZ
实验与指导-数组指针字符串 指针与数组区别
用指针数组的方法将字符串排序
本文主要讲了C语言中关于字符数组与字符指针的区别与用法,希望对你的学习有所帮助。
最详细的讲解,绝对适用,帮你区分两者区别
李云老师的两篇文章,分享出来。希望可以学习学习。
C语言第讲指针与字符串字符数组PPT课件.pptx
字符串是存放在字符数组中的,对字符数组中的字符逐个处理时,前面介绍的指针与数组之间的关系完全适用于字符数组。通常将字符串作为一个整体来使用,用指针来处理字符串更加方便。当用指向字符串的指针来处理字符串...
第8章 指针——字符数组与字符指针:字符串的输入和输出C语言程序设计第8章 指针{}一般不用字符串长度控制,如i逐个字符输入输出字符串C语言程序
本文档在某知名网站下载,要么浏览量最多,要么最新,保证精品,至少为你节约3RMB。格式为caj或者kdh需要专业阅读器打开。
第21章、字符数组和字符指针(理论课)
指针与字符串指针数组多级指针及练习PPT学习教案.PPTx
C++课程-3_数组指针与字符串 C++课程-3_数组指针与字符串
用指针数组的方法将字符串排序
C语言第讲指针与字符串字符数组PPT学习教案.pptx