| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 364 人关注过本帖
标题:C语言,关于指针,写入变量的问题,求高手多多指点,谢谢!!谢谢!!
只看楼主 加入收藏
weishen2011
Rank: 2
等 级:论坛游民
帖 子:92
专家分:70
注 册:2012-10-16
结帖率:80%
收藏
已结贴  问题点数:10 回复次数:9 
C语言,关于指针,写入变量的问题,求高手多多指点,谢谢!!谢谢!!
#include<stdio.h>
#include<stdlib.h>
int main()
{
char str[]="hello";

printf("请输入一个字符串:\n");
scanf("%s",str);

printf("您输入的字符串为:%s\n",str);
printf("还能做做剩下的工作吗?!");
system("pause");
return 0;
}
为什么指针指向常量字符串的情况下还可以写入其他的字符串啊???
搜索更多相关主题的帖子: 工作 include system return 
2012-11-22 12:12
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
什么编译器 什么编译参数
2012-11-22 12:13
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
str是数组 不是常量字符串

DO IT YOURSELF !
2012-11-22 12:13
c语言DYY
Rank: 2
等 级:论坛游民
帖 子:51
专家分:44
注 册:2012-10-21
收藏
得分:0 
覆盖的意思吧!像一个整数它有了值,也可以输进一个数去替代它本身的数值。
2012-11-22 12:37
jk_love
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:196
专家分:965
注 册:2012-10-22
收藏
得分:0 
楼主说的应该是 char *str="Hello"而不是数组
2012-11-22 14:04
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用jk_love在2012-11-22 14:04:01的发言:

楼主说的应该是 char *str="Hello"而不是数组

对对对 这是正解

楼主写的是对的 但想写个错的不知道怎么写 这个是错误的写法

上面我还问啥编译器啊 真愚蠢啊 高兴过头了
2012-11-22 14:05
liufashuai
Rank: 9Rank: 9Rank: 9
来 自:冥界-魔域-魂殿
等 级:蜘蛛侠
威 望:1
帖 子:370
专家分:1374
注 册:2012-6-22
收藏
得分:10 
其实是楼主理解错了,数组是常量指针,是指的数组名字是常量指针,该指针不能赋值,也就是数组名不能重新赋值
在不改变该指针的指向的情况下,改变数组内的数据是允许的
因为数组空间分配在栈上,只是用字符串常量初始化,所以,即使你改变了数组内的内容,常量存储区的字符串还是没有改变
是可以的

但是如果你定义的是一个指针的话,指针赋值直接指向常量区,那就不能更改了,如果改了,可能能通过编译链接(我在VC6.0下试过了,如果编译器检查比较严格,可以在编译器见检查出来)
但是运行肯定会报错的(一般式什么地址不可写)

[ 本帖最后由 liufashuai 于 2012-11-22 16:41 编辑 ]

有一种落差是,你配不上自己的野心,也辜负了所受的苦难。






2012-11-22 15:56
weishen2011
Rank: 2
等 级:论坛游民
帖 子:92
专家分:70
注 册:2012-10-16
收藏
得分:0 
以下是引用liufashuai在2012-11-22 15:56:10的发言:

其实是楼主理解错了,数组是常量指针,是指的数组名字是常量指针,该指针不能赋值,也就是数组名不能重新赋值
在不改变该指针的指向的情况下,改变数组内的数据是允许的
因为数组空间分配在栈上,只是用字符串常量初始化,所以,即使你改变了数组内的内容,常量存储区的字符串还是没有改变
是可以的

但是如果你定义的是一个指针的话,指针赋值直接指向常量区,那就不能更改了,如果改了,可能能通过编译链接(我在VC6.0下试过了,如果编译器检查比较严格,可以在编译器见检查出来)
但是运行肯定会报错的(一般式什么地址不可写)


为什么用数组定义的时候数组内数据能改,用指针定义就不行了呢?还是不太理解!
数组名不就相当于一个指针吗?指向数组的起始地址!为什么指针定义的就不能修改,而数组定义的就可以呢??
2012-11-22 22:41
lxsjzbd
Rank: 4
来 自:河北省
等 级:业余侠客
帖 子:97
专家分:258
注 册:2012-3-31
收藏
得分:0 
用数组时是把内存里一个“hello”常量字符串,赋给了你定义数组时开辟的数组内存里,然后就是修改数组内存了;
而你用指针指向“hello”常量字符串,修改时就是在直接修改常量字符串,当然不行了
2012-11-23 16:20
liufashuai
Rank: 9Rank: 9Rank: 9
来 自:冥界-魔域-魂殿
等 级:蜘蛛侠
威 望:1
帖 子:370
专家分:1374
注 册:2012-6-22
收藏
得分:0 
回复 8楼 weishen2011
这一点主要和内存分配有关
虽然指针变量都分配在栈上(就这题而言)。也就是说它们都是局部变量
但是指针指向的内存可以是任意的,可以使常量存储区,可以使堆上,当然也可以使栈上
但是数组时局部分配,在栈上分配内存

也就是说你定义的指针变量分配在了栈上,但是指向确实在常量存储区(要注意你修改的是指向的内容,而不是指针,因此才会造成这种差异)
但是数组指向的内存分配在栈上,虽然你用常量字符串给他初始化,但是(也许)那只是一个副本,给数组赋初值赋值以后,你修改的是数组中的内容
是栈上的内存,和字符串常量没关系了。即使你改变数组内的内容,但是字符串常量内容不会变化的

看下面这段代码:
程序代码:
#include <stdio.h>

int main()
{
    char *p = "abcde";
    char s[] = "abcde";

    s[1] = 'x';

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

    return 0;
}
输出是“abcde”而不是“axcde”就说明这个问题

另外注意之所以能用这个例子演示解释!一个主要的原因是:编译器的优化!当编译器发现两个相当的常量字符串,把它们优化为一个!如果没有这个前提,这样举例是不合理的,毕竟没法保证第一行和第二行的两个字符串常量是一个!

有一种落差是,你配不上自己的野心,也辜负了所受的苦难。






2012-11-27 15:45
快速回复:C语言,关于指针,写入变量的问题,求高手多多指点,谢谢!!谢谢!!
数据加载中...
 
   



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

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