图片做多的网站是哪个,在线科技成都网站推广公司,泰州市住房和城乡建设局官方网站,网页设计软件应用一、字符指针可以指向一个字符串。
我们可以用字符串常量对字符指针进行初始化。例如#xff0c;有说明语句#xff1a;
char *str This is a string.;是对字符指针进行初始化。此时#xff0c;字符指针指向的是一个字符串常量的首地址#xff0c;即指向字符…一、字符指针可以指向一个字符串。
我们可以用字符串常量对字符指针进行初始化。例如有说明语句
char *str This is a string.;是对字符指针进行初始化。此时字符指针指向的是一个字符串常量的首地址即指向字符串的首地址。
这里要注意字符指针与字符数组之间的区别。例如有说明语句
char string[ ]This is a string.;此时string是字符数组它存放了一个字符串。
字符指针str与字符数组string的区别是str是一个变量可以改变str使它指向不同的字符串但不能改变str所指的字符串常量。string是一个数组每个元素的值都可以改变。
例如下面的代码在运行期间将会出错 1 #include iostream2 using namespace std;3 int main(void)4 {5 char str1[] C Language;6 char *str2 C Language;7 cout str1 str1 endl;8 cout str2 str2 endl;9 str1[1] -;
10 str2[1] ;//出错不能改变str所指的字符串常量// str2 C Language;可以改变str使它指向不同的字符串
11 cout str1 str1 endl;
12 cout str2 str2 endl;
13 return 0;
14 }二、其它说明 以字符串形式出现的编译器都会为该字符串自动添加一个0作为结束符如在代码中写“abc”那么编译器帮你存储的是abc\0 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* ptrabc;因为定义的是一个普通指针并没有定义空间来存放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是被放在栈上的, 只不过是它所指向的东西被放在常量区罢了。 数组的类型是由该数组所存放的东西的类型以及数组本身的大小决定的。如char s1[3]和char s2[4]s1的类型就是char[3]s2的类型就是char[4]也就是说尽管s1和s2都是字符数组但两者的类型却是不同的。 字符串常量的类型可以理解为相应字符常量数组的类型如abcdef的类型就可以看成是const char[7] sizeof是用来求类型的字节数的。如int a;那么无论是sizeof(int)或者sizeof(a)都是等于4因为sizeof(a)其实就是sizeof(type of a) 对于函数参数列表中的以数组类型书写的形式参数编译器把其解释为普通的指针类型如对于
void func(char sa[100],int ia[20],char *p)则sa的类型为char*ia的类型为int*p的类型为char*
根据上面的总结来实战一下
对于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§ 4因为sa的类型是char*ia的类型是int*p的类型是char*。
三、区别
1字符数组由若干个元素组成每个元素中存放字符串的一个字符而字符指针变量中存放的是字符串的首地址。
2初始化方式不同。对字符数组初始化要用static存储类别在编译时进行。而对字符指针变量初始化不必在static在实际执行时进行。
3赋值方式不同。对字符数组不能整体赋值只能转化成份量对单个元素进行。而字符指针变量赋值可整体进行。
例如
1 char s[10]
2 s \C\/*对字符数组不能整体赋值*/4在定义一个字符数组时编译时即已分配内存单元有确定的地址。而定义一个字符指针变量时给指针变量分配内存单元但该指针变量具体指向哪个字符串并不知道即指针变量存放的地址不确定。例如
1 char a[10];
2 char *p;
3 scanf(\%s\a);/*正确*/
4 scanf(\%s\p)/*非常危险p的值动态*/5字符指针变量的值可以改变字符数组名是一个常量不能改变。例如有简单程序
1 main()
2 {
3 char *s\china man\
4 s6
5 printf(\%s\s);
6 }
7
8 //运行结果man