| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8978 人关注过本帖
标题:为什么字符指针不能中的字符串不能被重新赋值而数组中的却可以?
只看楼主 加入收藏
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
结帖率:81.82%
收藏
已结贴  问题点数:20 回复次数:15 
为什么字符指针不能中的字符串不能被重新赋值而数组中的却可以?
程序代码:
#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: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:5 
char *a="asdfg";这样定义的字符串其实是保存在堆上的,而且这一部分内存是不可修改的,也就是说是常量。
char a[6]="asdfg";这样定义的字符串其实是保存在栈上的,其实就是main函数的栈,这一部分的内存是可修改的,(自动变量)
2016-10-10 02:22
弟大勿勃
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
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:5 
#include<stdio.h>
void main()
{
    char *a;
    a=(char*)malloc(10);
    gets(a);
    a="adfth";
    a[3]='s';
    printf("%s\n",a);
}

你的程序是不是这样?
a又指向一个常量字符串,当然不能修改

#include<stdio.h>
void main()
{
    char *a;
    a=(char*)malloc(10);
    gets(a);
    a="adfth";
    //a[3]='s';
    printf("%s\n",a);
}
只给a赋值,而不改变a的元素值,可行
还有使用到malloc应该加上#include<malloc.h>头文件
2016-10-10 13:20
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:5 
程序代码:
#include<stdio.h>
void main()
{
    char *a="asdfg";//声明了一个指针a,指向静态常量“asdfg”
    a[3]='s';
    printf("%s\n",a);
}

程序代码:
#include<stdio.h>
void main()
{
    char a[6]="asdfg";//声明了一个字符数组,并用“asdfg”初始化
    a[3]='s';
    printf("%s\n",a);
}
“asdfg”两次都是静态常量都是不能修改的。
只是第一次声明的是一个指针,指向了这个静态常量。
而第二次声明了另一个数组,把静态常量的内容“复制”了过来。







φ(゜▽゜*)♪
2016-10-10 13:22
弟大勿勃
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
快速回复:为什么字符指针不能中的字符串不能被重新赋值而数组中的却可以?
数据加载中...
 
   



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

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