免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1971 | 回复: 9
打印 上一主题 下一主题

指针数组问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-01 09:52 |只看该作者 |倒序浏览
指针没学好,请指点迷津,谢谢!

    char s1[]="student";
      char *s2=s1;
      char *s3="teacher";
      *(s1+2)='M';    //正确
    *(s2+2)='M';    //正确
    *(s3+2)='M';    //运行时出错

请问 char s1[] 与 char *s3 的区别在那里? 
字符数组与字符串指针的区别在哪里?
这样赋值为什么会出错?
谢谢!

[ 本帖最后由 zhaocong94005 于 2008-4-1 09:53 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-04-01 09:55 |只看该作者
呀,和我刚刚发的贴的问题基本一样,俺也想知道

论坛徽章:
0
3 [报告]
发表于 2008-04-01 09:55 |只看该作者

回复 #1 zhaocong94005 的帖子

char *s3初始化后是只读的,不可修改
char s1[]是可读可写的
关于这个问题,有很多帖子讨论过,你可以翻翻

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2008-04-01 19:46 |只看该作者
原帖由 ruoyisiyu 于 2008-4-1 09:55 发表
char *s3初始化后是只读的,不可修改
char s1[]是可读可写的
关于这个问题,有很多帖子讨论过,你可以翻翻


正解。
兄台最近在忙什么呢,好久不见

论坛徽章:
0
5 [报告]
发表于 2008-04-01 20:53 |只看该作者
char s1[]="student";  相当于   char s1[7]="student";  所以能写

论坛徽章:
0
6 [报告]
发表于 2008-04-01 22:44 |只看该作者
char s1[] 和 char * s3 好像不同吧,s1 进行了初始化,程序会为其分配内存,而*s3 只是定义了一个指针,并指向teacher字符串,这条虽然可已编译通过,但由于没有为其分配内存,它可以占用任何地方,有可能覆盖其他代码导致程序崩溃。一家之言。

论坛徽章:
0
7 [报告]
发表于 2008-04-01 23:17 |只看该作者
原帖由 虑而后能得 于 2008-4-1 22:44 发表
char s1[] 和 char * s3 好像不同吧,s1 进行了初始化,程序会为其分配内存,而*s3 只是定义了一个指针,并指向teacher字符串,这条虽然可已编译通过,但由于没有为其分配内存,它可以占用任何地方,有可能覆盖 ...



不是这个原因,3楼已经解释清楚了,其实就是常量不能更改的原因。

论坛徽章:
0
8 [报告]
发表于 2008-04-01 23:55 |只看该作者
>> 请问 char s1[] 与 char *s3 的区别在那里? 
>> 字符数组与字符串指针的区别在哪里?

这段程序中出现了 5 个对象:s1 是一个数组对象,s2、s3 都是指针对象,"student" 和 "teacher" 两个字符串都是数组对象。

s2 和 s1 的值相等,所以第一个赋值语句和第二个赋值语句所起的作用是相同的,即修改 s1 数组中的 s1[2] 元素,而不是修改用于初始化 s1 数组的 "student" 字符串。s3 指向 "teacher" 字符串,所以第三个赋值语句是通过指针 s3 间接修改 "teacher" 的第三个元素(即 "teacher"[2])。

>> 这样赋值为什么会出错?

这样做语法上没有问题,所以编译不会有问题。然而 C 和 C++ 标准都规定修改字符串字面量的行为是无定义的,而含有未定义行为的程序是错误的程序。因此,编译器在实现上可以有充分的自由安排字符串字面量的存储:可以把它放在可读写内存,也可以放在只读内存。如果是前者程序可能会运行正常;你遇到的是后一种情况,是操作系统提供的内存保护机制起了作用,使程序运行异常中止。

>> char *s3初始化后是只读的,不可修改

s3 是一个可读写的指针变量。你想说的应该是 s3 指向的字符串吧。

论坛徽章:
0
9 [报告]
发表于 2008-04-02 09:02 |只看该作者

回复 #8 whyglinux 的帖子

>> >>>>s3 是一个可读写的指针变量。你想说的应该是 s3 指向的字符串吧。
就是这个意思,不过表达能力不行啊

论坛徽章:
0
10 [报告]
发表于 2008-04-02 17:11 |只看该作者

回复 #1 zhaocong94005 的帖子

数组名只有在作为函数参数时才相当与指针,
其它的时候与指针不同
所以s1是数组名,而s3 是指针.它们不是不同的.
至于赋值出错的问题,已经有人讨论过了,自己找找.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP