关于字符串指针

1、

#include <stdio.h>

int main()

{

char *p = "1edr";

printf("p = %s\n",p);

if(*p == '1')

   printf("*p = '1'\n");

return 1;

}

运行结果:

p = 1edr

*p = '1'


指针的本质就是一个存储地址的变量,它存储的一定是地址, char *p = "1edr"实际上就是把字符串‘1’这个首字符的地址赋给指针p。而printf中的%s也指定了printf第二个参数必须是地址,printf会输出地址上的值。

所以

#include <stdio.h>

int main()

{

char *p = '1';

if(*p == '1')

   printf("*p = '1'\n");

return 1;

}

运行结果:

segment fault

因为char *p = '1';并不是将字符'1'的地址赋给了p,而是将'1'强制转换成了一个地址,然后赋值给了p,这样因为地址‘1’是不允许访问的,所以*p就会导致地址非法访问。


2、

C/C++code ?
1
2
3
4
5
char  *m  "hello" ;
     *(m+1)  's' ;
     for (;*m !=  '\0' ;m++){
         printf ( "%c\n" ,*m);
     }

但是出运行时错误。
----------------------------------------------------------
用数组下标的方式是可以修改的:
C/C++code ?
1
2
3
4
5
6
7
8
int  0;
     char  w[]  "hello" ;
     w[1]  's' ;
     
     while (w[i] !=  '\0' ){
         printf ( "%c\n" ,w[i]);
         i++;
     }
char *m "hello";<=>const char*m="hello";
char *m "hello";
"hello"保存在静态数据区,该数据不能修改.
由指针m指向. 不能通过指针m来修改静态数据区的值.

char *p = "hello";本质是把常量区存放"hello"这六个字符的地址赋给了指针p,常量区地址上的内容是不允许被修改的,所以无法通过指针修改这个字符串。

如果想要修改字符串有两个方法,一是可以用数组来存储字符串,这样字符串就存储在栈区,二是可以用malloc,这样字符串就存储在堆区。pa = (char*)malloc(5 * sizeof(char));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值