字符串

来源:互联网 发布:淘宝联盟佣金几号结算 编辑:程序博客网 时间:2024/06/10 22:26
定义一个字符串,无论是在主函数还是在其他函数中定义,该字符串存储的位置是在只读代码段上,既不是堆也不是栈,所以如果在主函数和其他函数中分别定义一个字符串,在其他函数中用write(1,p,10)打印字符串,会将主函数的字符串一并打出,这说明字符串是在代码段连续存储的。【其中1表示标准输出,p是其中一个字符串的指针,该字符串的字符数为5】
字符串 - wade53784 - LinuxOracle
关于字符串,如果定义成 
        char *p ="Helloworld!";
那么指针变量p存储的是字符串首个字符的地址,即为h的首地址。
所以关于printf("helloworld\n");这个语句,printf函数接收的是一个地址参数,所以函数也可以这样写
printf(p);
 那么既然可以和指针联系在一起,那么我们能不能改变字符串的值呢?比如,p[0]='H';很显然,在只读数据段,是不可以写的,所以没法修改。
但是,如果这样定义的话
char a[] ="hello,world!";
这样写的话,意思是将hello,world!最初定义在只读数据段的内容,复制一份给数组a[],而复制的那一份是存储在stack栈里面的!
所以说,这样定义的话,即使已经定义了字符串,但是仍然可以像这样操作
a[0] = 'H';
另外,值得注意的是,printf("%d",sizeof(p));和printf("%d",sizeof(a));得到的结果是不一样的,前者是4,后者是13.
虽然变量p和数组首地址a都属于char*类型,但是在使用sizeof的时候,编译器会把a看做整个数组的长度!
最需要注意的是,当定义一个chara[] = {'a','b','c','d'};或者是int b[] ={1,2,3,4};这种用数组来写的时候,用sizeof求得的结果就不是字符串的长度而是每个数组大小的总和,比如intb[]这个数组,如果每个元素占2个字节,用sizeof求得就是8,chara[]就是得到4*1=4;再用strlen的时候,类似char a[]和intb[]这种非字符串形式,编译是会报错的。
但是如果用strlen()这个函数,求得是除去'\0'字符的长度!用sizeof会把'\0'算入!

转发至微博
 
转发至微博
1 0