标题:字符串指针问题
只看楼主
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
已结贴  问题点数:20 回复次数:26 
字符串指针问题
RT
#include <stdio.h>

int main(void)
{
    char *s1, *s2;
    int i = 0;

        s1 = "I love china!";
        s2 = "I love beijing!"; // s1 s2 都获得了地址吗?
        while (*(s1 + i) != '\0')
        {
            *(s2 + i) = *(s1 + i);
            i++;
        }
         *(s2 + i) = '\0';
         for (i = 0; *(s2 + i) != '\0'; i++)
        printf("%c", *(s2 + i));
         printf("\n");
    return  0;
}
程序编译 连接都可以 为什么运行不了,
如果把指针换成数组,实行数组初始化就可以,这是为什么,数组首地址不就是指针吗?
搜索更多相关主题的帖子: beijing include return 字符串 china 
2012-01-02 21:54
liao06550107
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:111
专家分:696
注 册:2011-10-2
得分:5 
C语言对字符串常量是按字符数组处理的,在内存开辟了一个字符数组用来存放字符串常量
,那句实际上市把字符串首地址赋给指针。
这个涉及到字符串指针和字符串数组的区别,在c++中,字符串指针被认为是常量指针,即可以理解为const char*类型,因为const char*常量指针指向的内容不能更改,所以任何试图改变改字符串的操作都会报错,如果要实现,只能拷贝一份,对拷贝字符串进行操作。
但是指针本身的值可以改变。注意区分(char* const p和const char *p)

[ 本帖最后由 liao06550107 于 2012-1-2 22:42 编辑 ]

听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,走的多了,站的高了,自然就看的远了。
2012-01-02 22:06
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 2楼 liao06550107
定义了指针,然后给指针以字符串首地址,那么*(s + i)及后面的操作为什么不成立。非把定义指针换成数组初始化才可以?

梅尚程荀
马谭杨奚







                                                       
2012-01-02 22:17
liao06550107
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:111
专家分:696
注 册:2011-10-2
得分:0 
!!!

[ 本帖最后由 liao06550107 于 2012-1-2 23:02 编辑 ]

听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,走的多了,站的高了,自然就看的远了。
2012-01-02 22:46
liao06550107
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:111
专家分:696
注 册:2011-10-2
得分:0 
程序代码:
程序可以使用的内存有三种,
1:静态地址,存放程序,常量。
2:运行时栈,声明的变量时在这里分配空间,临时的数据也保存在栈,
3:堆地址,动态分配内存的时候从堆里面分配。
区别:

char a[] = "hello";  
相当于 
char a[6]; 
strcpy(a, "hello"); 
在栈上分配一个数组a,将常量字符串"hello"的内容复制给a数组  

char *a = "hello";  
在栈上分配了一个指针a,将其指向常量字符串"hello"的首地址(注意hello是常量存在静态地址区)


[ 本帖最后由 liao06550107 于 2012-1-2 23:00 编辑 ]

听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,走的多了,站的高了,自然就看的远了。
2012-01-02 22:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
回复 楼主 有容就大
你自己单步执行看看在哪一行运行不下去就知道是什么原因了,这种调试功夫,不要总问人。

授人以渔,不授人以鱼。
2012-01-03 00:26
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
你只要告诉我,下面这些语句在干什么,说出来自己就知道到底哪出了问题:
*(s2 + i) = *(s1 + i);
*(s2 + i) = '\0';

授人以渔,不授人以鱼。
2012-01-03 00:29
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
你只要告诉我,下面这些语句在干什么,说出来自己就知道到底哪出了问题:
*(s2 + i) = *(s1 + i);
*(s2 + i) = '\0';

我的想法是指针指向字符串的首地址然后,+i使他逐个指向后续字符,并通过*(s2 + i) = *(s1 + i);将s1的字符替换s2相应位置的字符,最后赋结束符。
一开始我认为这是合理的,后来去调试了下,到这个语句出现
后就无法往下走了,难道是s1 + 1无法指向后续字符?

梅尚程荀
马谭杨奚







                                                       
2012-01-03 14:46
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:10 
你这些语句是企图用指针方式修改常量数据区,而那是被宣布为“只读”的区域,你要修改,系统干么不踢你出来!

授人以渔,不授人以鱼。
2012-01-03 14:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
Access Violation
你查一查字典这些单词是什么意思,自然明白。

授人以渔,不授人以鱼。
2012-01-03 14:55



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-359061-1-1.html




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

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