| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 905 人关注过本帖
标题:字符指针问题,求助
只看楼主 加入收藏
baobaoisme
Rank: 7Rank: 7Rank: 7
来 自:AVATAR
等 级:黑侠
帖 子:260
专家分:506
注 册:2010-7-9
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:10 
字符指针问题,求助
程序代码:
#include<stdio.h>

void main()
{
    void copy_string(char *from,char *to);
    char from[] = "I am a teacher.";
    char to[] = "You are a student.";
    char *a = from,*b = to;
    printf("%c\n",*from);
    printf("string a = %s\nstring b =%s\n",a,b);
    printf("copy string a to string b\n");
    copy_string(a,b);
    printf("string a = %s\nstring b =%s\n",a,b);
}
void copy_string(char *from,char *to)
{
    for(;*from!='\0';from++,to++)
    *to = *from;
    *to = '\0';
}
我将代码中的 from[] 和 to[] 改成了字符指针 *from 和 *to,调试就会出现错误
望各位大侠指点迷津,帮我这个小菜鸟指出错误,非常感谢
搜索更多相关主题的帖子: 指针 字符 
2010-07-09 00:34
fly_kurt
Rank: 2
来 自:浙江
等 级:论坛游民
帖 子:21
专家分:50
注 册:2010-6-28
收藏
得分:4 
调试不会出错啊

有一天,世界会在你手中舞动!
2010-07-09 09:35
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:4 
你出现的错误是:该内存不能written;
用字符指针,得到的只是一个只读地址,指针里的内容不能修改.
*from="I am a teacher.";
from所指的内容不能修改 所以一旦修改了如 *from=1;也会报同样的错.

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-07-09 09:56
Jade0709
Rank: 2
等 级:论坛游民
帖 子:14
专家分:15
注 册:2010-7-6
收藏
得分:4 
原因:char *from = "I am a teacher.";
      char *to = "You are a student.";
这样定义的话,from和to是指向字符串常量的字符指针,而字符串常量"I am a teacher.","You are a student."所在的空间(应该是数据空间)是只读的,那么在copy_string函数中你对只读空间进行写操作(*to = *from;)就会出错。

  char from[] = "I am a teacher.";
    char to[] = "You are a student.";
这样定义,是在程序运行的动态内存中分配空间,然后from,to指向分配的空间,这个空间是可读写的,所以不会有问题。

其实只是变量分配的空间不同。

如果要用指针的话copy_string函数中就应该只是改变指针(三个语句直接改为:to=from;)也是可以的,应为这样是对to、from做修改,而不是对其指向的空间(只读空间)做修改。
2010-07-09 10:07
a151937404
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:46
专家分:117
注 册:2010-6-11
收藏
得分:4 
char from[] = "I am a teacher.";和char *from = "I am a teacher.";区别是编译的时候前面from在编译器符号列表里面,它直接映射的是字符串的首地址,当然可以用from++这种运算来取得字符串的值,但是后面的方式告诉编译器from是指针,并且它指向存放字符串首地址的地址,它当然不可以用++运算符,谁都不知道它附近的地址存放的内容是什么,也就不可以修改(write)。
char from[] = "I am a teacher."; form[1]
char *from = "I am a teacher."; from[1]
两者取值过程是不同的。

[ 本帖最后由 a151937404 于 2010-7-9 11:25 编辑 ]
2010-07-09 11:24
Jade0709
Rank: 2
等 级:论坛游民
帖 子:14
专家分:15
注 册:2010-7-6
收藏
得分:0 
以下是引用a151937404在2010-7-9 11:24:24的发言:

char from[] = "I am a teacher.";和char *from = "I am a teacher.";区别是编译的时候前面from在编译器符号列表里面,它直接映射的是字符串的首地址,当然可以用from++这种运算来取得字符串的值,但是后面的方式告诉编译器from是指针,并且它指向存放字符串首地址的地址,它当然不可以用++运算符,谁都不知道它附近的地址存放的内容是什么,也就不可以修改(write)。
char from[] = "I am a teacher."; form[1]
char *from = "I am a teacher."; from[1]
两者取值过程是不同的。
指针怎么就不能++运算了,char *from = "I am a teacher.";对from++是没有问题的。
2010-07-09 11:27
a151937404
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:46
专家分:117
注 册:2010-6-11
收藏
得分:0 
以下是引用Jade0709在2010-7-9 11:27:08的发言:

指针怎么就不能++运算了,char *from = "I am a teacher.";对from++是没有问题的。
我打错了,应该是它from++内容不能写。
2010-07-09 11:36
ymmy
Rank: 2
等 级:论坛游民
帖 子:15
专家分:19
注 册:2010-5-28
收藏
得分:4 
printf("%c\n",*from)是对的。但我改一下再讲你就更容易明白。然后我会回到你的这种写法在讲。
注:1。将%c改为%s
    2。将*from改为from
    3。即printf("%s\n",from);
    4。原因:A。%c输出单个字符,%s输出字符串。
             B。from是指针变量,即一个首地址,遇到"\0"结束。从而可以正确输出里边内容"I am a teacher"。
                *from是指指针变量所指的内容,即内容。但内容不是"I am a teacher",只是首地址的内容"I"。这就是printf("%c\n",*from)能正确输出"I",但printf("%s\n",*from)输出不了"I am a teacher"的原因。

[ 本帖最后由 ymmy 于 2010-7-9 12:26 编辑 ]
2010-07-09 12:22
baobaoisme
Rank: 7Rank: 7Rank: 7
来 自:AVATAR
等 级:黑侠
帖 子:260
专家分:506
注 册:2010-7-9
收藏
得分:0 
非常感谢各位的解答,学到不少东西,以后有问题再请教啊!
2010-07-09 13:42
a151937404
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:46
专家分:117
注 册:2010-6-11
收藏
得分:0 
ANSI C中,初始化指针时所创建的字符串常量被定义为只读,字符串常量初始化的数组时可以修改的。
2010-07-09 14:13
快速回复:字符指针问题,求助
数据加载中...
 
   



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

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