C++中的指针和常量引发的问题

发布网友 发布时间:2022-04-20 05:00

我来回答

5个回答

热心网友 时间:2023-05-11 12:07

第一个: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)

热心网友 时间:2023-05-11 12:07

char a1[]="asdghh";实际上相当于char a1[7]="asdghh";
定义了一个长度为7的字符数组,注意,这个数组是你自己定义的,所以你能修改它的值。
而char *p = "123456";则仅仅是声明了一个指针变量,这个变量指向了一个常量字符串"123456",而常量字符串的值是不允许修改的。

热心网友 时间:2023-05-11 12:07

在第一个中:
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"; 中的字符串存于堆栈区,和普通的变量一样,可读写

热心网友 时间:2023-05-11 12:08

#include<stdio.h>
是你的指针用的不对,不是可读不可读的问题

#include<stdlib.h>
void main()
{
char *p = "123456";
char *s = "asdghh";
s = p;
printf(s);
}

热心网友 时间:2023-05-11 12:09

指针只是存放的地址,没有真正的空间的!而定义一个数组以后,它是有真正的空间的,把指针指向数组后,这个指针指向的是一个有空间的地址,所以就可以可读可写了!我的理解,参考一下吧!
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com