字符串

定义一个字符串,无论是在主函数还是在其他函数中定义,该字符串存储的位置是在只读代码段上,既不是堆也不是栈,所以如果在主函数和其他函数中分别定义一个字符串,在其他函数中用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'算入!

转发至微博
 
转发至微博
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值