51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 2767|回复: 5
打印 上一主题 下一主题

[讨论] (求助)一个简短的c语言代码困扰我

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2008-5-6 12:22:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
# include "stdio.h"
void main()
{
        char *a="test";
        *a='c';
        printf("%s",a);
}

上面这段代码哪里错了?我想把test换成cest输出,字符串在c语言中不是作为字符数组存在于内存中吗,指针变量a应该指向"test"中的首地址't',语句*a='c';把t换成了c,可是这段代码执行报错
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2008-5-6 14:49:36 | 只看该作者
最简单的方法,可以用数组轻松实现
#include "stdio.h"
void main()
{

        char a[] = "test";
        a[0]='c';
        printf("a=%s",a);

}
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2008-5-6 15:47:03 | 只看该作者
没有错啊,我用WIN-TC编译运行 结果显示 a=cest
是lz编译器的问题吧
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2008-5-6 16:21:44 | 只看该作者
虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者是有区别的,不能混为一谈,主要有几点:


1、字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串的首地址),决不是将字符串放到字符指针变量中。

2、初始化方式:如char str[ ]={ "I love China! ");这是对数组中的每个元素做初始化。
   char *a="I love China! ";并没有对数组初始化,只是对指针变量初始化。

3、赋值方式:对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值。
char str[14];
str="I love China! ";
而对字符指针变量,可以采用下面方法赋值:
char *a;
a="I love China! ";

但注意赋给a的不是字符,而是字符串的首地址。
4、赋初值时,对以下的变量定义和赋初值:

char *a="I love China! ";

等价于:

char *a;

a="I love China! ";

而对数组初始化时:

static char str[14]={ "I love China! "};

不是等价于

char str[14];

str[ ]= "I love China! ";

即数组可以在变量定义时整体赋初值,但不能在赋值语句中整体赋值。

5、在定义一个数组时,在编译时即已分配内存单元,有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个地址值,也就是说,该指针变量可以指向一个字符型数据,但如果未对它赋以一个地址位,则它并未具体指向哪一个字符数据。如:

char *a,str[10];

a=str;

scanf("%s",a);

先使a有确定值,也就是使a指向一个数组的开头,然后输入字符串到该地址开始的若干单元中。

6. 指针变量的值是可以改变的,如:

void main(void)

{char *a="I love China! ";

a=a+7;

printf("%s",a);

}

运行结果应该如下:

China!

指针变量a的值可以变化,输出字符串从a当时所指向的单元开始输出各个字符,直到遇’\0’为止。而数组名虽然代表地址,但它的值是不能改变的。下面是错的:

char str[ ]={ "I love China! "};

str=str+7;

printf("%s",str);

针对你这个问题可以修改成这样:

# include "stdio.h"
void main()
{

char[] b="test";
char *a=b; *a='c';
printf("%s",a);
}

先写这么多,不知道能理解不?
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2008-5-6 17:22:29 | 只看该作者
楼上说的太复杂了,
简单说当你执行 char *a="test";这句后
字符串指针变量a指向"test"的首地址也就是字符"t"的地址

当你执行 *a='c';这句时等价与 "t"='c' 对于一个字符常量赋值肯定是错误的,如果是在VC下编译会提示内存不能写入,TC2.0我没试,在win-tc下第一次运行可能会成功,如果你再运行的话,输出的结果肯定不是你想要的,会有写入错误的提示。

不知道说的对不,高人来说下吧
附个图

[ 本帖最后由 bwg198411 于 2008-5-6 17:27 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2008-5-8 14:29:29 | 只看该作者
字符串是常量,只能读,不能对它进行写操作.以前16位的,32位的操作系统对应用程序的内存使用进行了限制,读和写分开了
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-5-24 19:13 , Processed in 0.073729 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表