| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8994 人关注过本帖
标题:为什么字符指针不能中的字符串不能被重新赋值而数组中的却可以?
取消只看楼主 加入收藏
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
结帖率:81.82%
收藏
已结贴  问题点数:20 回复次数:9 
为什么字符指针不能中的字符串不能被重新赋值而数组中的却可以?
程序代码:
#include<stdio.h>
void main()
{
    char *a="asdfg";
    a[3]='s';
    printf("%s\n",a);
}

以上程序会运行冲突,看过解释说"asdfg"是常量字符串不能被修改;
但是下面的程序是关于数组的,同样是"asdfg"常量字符串,怎么就能修改了???
程序代码:
#include<stdio.h>
void main()
{
    char a[6]="asdfg";
    a[3]='s';
    printf("%s\n",a);
}
搜索更多相关主题的帖子: 字符串 asdfg 
2016-10-10 00:12
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 2楼 八画小子
就是说堆上没有分配实际的内存咯,而指针变量p表示的字符串常量是在堆上的,
不能被改动。
数组a表示的字符串常量是在栈上的,有分配内存存储元素,所以就可以改了?
那a和p到底是变量还是常量啊?
2016-10-10 10:53
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
别潜水嘛,知道原因的麻烦解释一下嘛!
2016-10-10 10:56
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
在网上看到一个解释,觉得还不错:
字符串常量:
char *p="ni hao!";
如果你试图改变指针所指向的内容是会报错的.
例如:(*p)='h';//运行的话会报错
因为字符串常量是放在静态存储区的,这部分内容是不能修改的。

字符串变量:在c中是没有这个概念的,c中如果想将一个字符串存放到变量中,必须使用字符数组,就是用一个字符型数组存放一个字符串,例如:
char data[10]="china";这时候,这个字符数组存放了一个字符串,它是可以改变的,
例如:data[0]='m';这种操作都是可以的。
2016-10-10 11:29
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 2楼 八画小子
我把指针变量a分配了一个动态存储区,然后再输入字符串,再改变字符串中的值就没有冲突,如下:
程序代码:
#include<stdio.h>
void main()
{
    char *a;
    a=(char*)malloc(10);
    gets(a);
    //a="adfth";
    a[3]='s';
    printf("%s\n",a);
}

但是,此时就不能再给a赋值了,这是为什么啊?
2016-10-10 11:43
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 8楼 书生牛犊
    就是说"asdfg"这个字符串常量在系统中是存储在静态存储区的,当使用字符指针变量来
指向它的时候,由于它是一个常量,用"a[3]='s';"这样的语句实际就是让字符串常量"asdfg"
发生改变,这是不行的。
    当用"a[6]="asdfg";"这样的语句时,就是把字符串常量赋值到了数组中了,用"a[3]='s';"
这样的语句实际是改变数组的第四个元素的值,就可行。那么,在这里数组a就是一个变量了
咯,不然怎么能改变它的值呢!就是说"a[6]="asdfg";"这样的语句赋值了a,但它还是个变量?
2016-10-10 13:39
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 2楼 八画小子
那您的意思是只要给堆上的字符串常量申请一个动态空间存放“asdfg”字符串常量就可以改变它的值了吗?
2016-10-10 13:44
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 11楼 书生牛犊
感谢感谢!我又看了一下堆栈这一块的知识,加深了理解。
2016-10-10 16:23
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 7楼 word123
我给指针a分配了一个动态空间a=(char*)malloc(10);
然后用gets()函数输入字符串,此时我用 a[3]='s';
语句能修改字符串的值。这就说明给指针变量a分配了
动态内存后,就会使a产生什么变化(不再是指针?)
这样做好像使栈中的a指向了分配域(堆中的)起始地址,不再
指向了"adfth"字符串常量,所以当用gets函数输入字符串到
a所指的分配域中后,可以用a[3]='s';语句改变字符串的值
(此时a相当于一个数组了)。
#include<stdio.h>
void main()
{
    char *a;
    a=(char*)malloc(10);
    gets(a);
    //a="adfth";
    a[3]='s';
    printf("%s\n",a);
}
不知道我以上的分析对不对,不对请纠正指出!
2016-10-10 16:59
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 15楼 word123
嗯,谢谢
2016-10-10 19:49
快速回复:为什么字符指针不能中的字符串不能被重新赋值而数组中的却可以?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013647 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved