| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1382 人关注过本帖
标题:const 指针问题
只看楼主 加入收藏
haoyasen
Rank: 2
等 级:论坛游民
帖 子:90
专家分:20
注 册:2013-3-30
收藏
得分:0 
回复 10楼 TonyDeng
我刚在定义了 int i=strlen(p); char a[i];
q=a;可以了
问下还有更好的方法吗谢谢你
2013-04-04 09:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你要什么更好的方法?我看你对指针的概念还没清晰。

授人以渔,不授人以鱼。
2013-04-04 09:32
haoyasen
Rank: 2
等 级:论坛游民
帖 子:90
专家分:20
注 册:2013-3-30
收藏
得分:0 
回复 12楼 TonyDeng
嗯,指针怎么学那
2013-04-04 09:34
haoyasen
Rank: 2
等 级:论坛游民
帖 子:90
专家分:20
注 册:2013-3-30
收藏
得分:0 
回复 12楼 TonyDeng
你觉得这个怎么改 我想吸取一下大神 带一下把
2013-04-04 09:36
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
找一个你熟悉的模型来类比指针。指针就相当于名片,名片本身是一张纸实体,但并不是它所代表的那个人实体,名片必须与它所代表的那个人互相匹配才是有效的,人不在了,名片还在,那是没意义的名片。要弄指针,首先要确保它是有效的,即指针所指向的地址是真实的地址(0或NULL就不是真实的地址),如果你要用这指针读数据,则它所指向的地址必须能读,如果你要用这指针写数据,则它所指向的地址必须能写,这些都要程序员自己思考能不能做到,不是乱写一气的。

授人以渔,不授人以鱼。
2013-04-04 09:39
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
include<stdio.h>

void main(void)
{
    const char* p = "ssss";
    const char* q = p;
    ptintf("%s",q);
}

换句话说,你的q指针是多余的。

授人以渔,不授人以鱼。
2013-04-04 09:41
haoyasen
Rank: 2
等 级:论坛游民
帖 子:90
专家分:20
注 册:2013-3-30
收藏
得分:0 
回复 15楼 TonyDeng
谢谢大神 了
2013-04-04 09:45
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
const char* p = "ssss";
这个定义,已经定义了一个指针p,它指向程序静态只读数据区中的一个字符串"ssss",编译器已经为这种数据分配了地址,现在指针p就是指向了这个地址,而且为了明确这个数据是只读的,所以给指针p附加了修饰符const,表示它所指向的数据不应被修改(即使不加const修饰,编译器发现赋值是"ssss",也会自动定义这个指针是const指针,写上是表示你自己很清楚这一点)。p已经是一个字符串的名字,直接用来printf()就可以了。

后面的定义
char* q = p;
这里q被声明为普通指针,意味着它所指向的数据可被修改,但定义的时候给指针p赋值指向的却是一个指向只读数据的地址(p),这样就隐含你试图修改这个地址所指向数据的意图,聪明的编译器发现这是危险的意图,所以向程序员指出这是不应该的——但有些“小聪明”的程序员可以用强制转换或取消只读操作来消灭这种错误信息,自以为解决了问题。一般来说,如果地址所指向的数据,真的是只能(或者应该只能)读不能写,就写上const,在写代码的过程中确保遵守规矩,不要乱转,听从编译器的劝告,不要以为懂一些细节就强行取消只读属性,那样造成的逻辑麻烦是自己找的。

[ 本帖最后由 TonyDeng 于 2013-4-4 10:01 编辑 ]

授人以渔,不授人以鱼。
2013-04-04 09:47
haoyasen
Rank: 2
等 级:论坛游民
帖 子:90
专家分:20
注 册:2013-3-30
收藏
得分:0 
回复 18楼 TonyDeng
可能我没问清楚 ,你分下心 大神 如果 让p="abcd"让各个字符依次后移一位付给q,第一位用s 替代怎么破,在帮下
2013-04-04 09:54
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用haoyasen在2013-4-4 09:54:12的发言:

可能我没问清楚 ,你分下心 大神 如果 让p="abcd"让各个字符依次后移一位付给q,第一位用s 替代怎么破,在帮下

给q另外申请一块内存,把所需要的字符逐个抄过去。不要试图对p所指向的数据作任何修改,那是必定要失败的,因为这些数据存在程序的静态只读数据区中!其实对指针来说,不需要这样复制也可以取值,从p+1开始读数据就可以了:
程序代码:
for(int i = 1; *p != '\0'; ++i)
{
    printf("%c", *(p + i));
}


[ 本帖最后由 TonyDeng 于 2013-4-4 10:07 编辑 ]

授人以渔,不授人以鱼。
2013-04-04 10:03
快速回复:const 指针问题
数据加载中...
 
   



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

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