#include<stdio.h>
#include<stdlib.h>
void main()
{
char *p = "123456";
char *s = "asdghh";
*s = *p;
}
问题:运行时会报错,实际上就是说指针 p和s 所指向的内存是只读的,但是不可以写;改为如下就是正确的了:
{
char a[]="123456";
char *p = a;
char a1[]="asdghh";
char *s =a1;
*s = *p;
}
此时,指针 p和s 所指向的内存是可读可写的!!!!
请高手解释下,谢谢!!!
C语言中关于字符串指针常量的问题
答案:5 悬赏:40
解决时间 2021-12-30 14:58
- 提问者网友:伴他一生,无悔
- 2021-12-29 20:40
最佳答案
- 二级知识专家网友:野性且迷人
- 2021-12-29 21:05
第一个:char *p = "123456";
char *s = "asdghh";
*s = *p;
你这个之所以会错,是因为指针s指向的是常量字符串 asdghh 而*s=*p相当于改变常量字符串的值,常量是不能改变的,而且常量也不能做左值,所以出错。
第二个:
char a[]="123456";//这个的意思是 在内存充开辟空间 把常量字符串复制到这个空间
char *p = a;//这个说明指针p存储的是数组变量a的地址
char a1[]="asdghh"; //同上
char *s =a1; //同上
*s = *p; // 这句的意思是 把指针p所指向空间的值(这里为数组a)复制到指针s所指向的空间(这里为数组a1)
char *s = "asdghh";
*s = *p;
你这个之所以会错,是因为指针s指向的是常量字符串 asdghh 而*s=*p相当于改变常量字符串的值,常量是不能改变的,而且常量也不能做左值,所以出错。
第二个:
char a[]="123456";//这个的意思是 在内存充开辟空间 把常量字符串复制到这个空间
char *p = a;//这个说明指针p存储的是数组变量a的地址
char a1[]="asdghh"; //同上
char *s =a1; //同上
*s = *p; // 这句的意思是 把指针p所指向空间的值(这里为数组a)复制到指针s所指向的空间(这里为数组a1)
全部回答
- 1楼网友:你把微笑给了谁
- 2021-12-29 23:13
首先请明确一点:指针也是变量, 只不过编译器解析该变量时将它的内容看作地址去访问内存.
其次请明确应,程序分为不同的段,包括代码段、数据段等。
类似“hello”这类的变量实际是常量字符串,位於程序的代码段,char *ptr="hello表示定义字符指针ptr、并将字符串“hello”的首地址赋值给ptr,如此便可通过ptr引用“hello”,当然是只读引用了。(注意和char ptr[] = "hello"区分,後者定义了一个字符数组ptr)
- 2楼网友:苦柚恕我颓废
- 2021-12-29 22:44
在第一个中:
void main()
{
char *p = "123456";
char *s = "asdghh";
*s = *p;
}
语句 *s = "asdghh"; 定义了一个指针变量s,它指向静态存储区的常量区(常量区的内容不可被修改)。所以运行时*s = *p; 你试图改变常量区的内容时,系统会报错。
同理,若执行语句*p = *s; 会报同样的错。
在后面该正确的代码中:
{
char a[]="123456";
char *p = a;
char a1[]="asdghh";
char *s =a1;
*s = *p;
}
也就是说这两句话运行正确:
char *s =a1;
*s = *p;
原因:char a1[]="asdghh"; 实际上相当于 char a1[7]={'a','s','d','g','h','h','\0',}; 编译时 系统会在堆栈区里分配连续的7*sizeof(char)的空间,并将首地址传给数组a1.
所以char *s =a1; 即字符指针变量s同样指向上述的空间首地址,
*s=*p同样可以运行。
综上所述二者的本质区别在:
前者char *s = "asdghh"; 中的字符串存于常量区,不可写
后者char a1[]="asdghh"; 中的字符串存于堆栈区,和普通的变量一样,可读写
- 3楼网友:星痕之殇
- 2021-12-29 21:30
#include<stdio.h>
是你的指针用的不对,不是可读不可读的问题
#include<stdlib.h>
void main()
{
char *p = "123456";
char *s = "asdghh";
s = p;
printf(s);
}
- 4楼网友:怪咖小青年
- 2021-12-29 21:11
char a1[]="asdghh";实际上相当于char a1[7]="asdghh";
定义了一个长度为7的字符数组,注意,这个数组是你自己定义的,所以你能修改它的值。
而char *p = "123456";则仅仅是声明了一个指针变量,这个变量指向了一个常量字符串"123456",而常量字符串的值是不允许修改的。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯