免费注册 查看新帖 |

Chinaunix

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

[原创]对指针的两点认识 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-06 10:16 |只看该作者 |倒序浏览
一个小程序用来试探指针的世界
> vi t.c
"t.c" 18 lines, 239 characters
#include<string.h>
#include<stdio.h>
char global[]="123";
void f(char* s){
s[0]='8';
s[1]='9';
}
void g(char **s){
*s=global;
}
int main(){
char buf1[]="abcd";
char *buf2="efgh";
f(buf1);
g(&buf2);
printf("%s,%s\n",buf1,buf2);
return 0;
}


程序运行输出
> ./a.out
89cd,123
-------------------------------------------------------
两点收获:
(1)如果buf2的声明不是char *buf2="efgh";而是char buf2[]="efgh";那么编译就会提示g(&buf2);失败。我的分析是,静态数组在编译的时候被替换成某个"立即数"表示的地址而不是像char* buf2保存在变量里面,因此不能取地址操作。这个是指针数组和静态数组的一个重要区别。虽然我们平时用起来似乎没有感觉。
(2)函数g是用来改变输入指针变量所指的值。如果声明为g(char*s)那么s的值是从buf2拷贝过来的,对s改变,并不能改变buf2的指向。我尝试了
(2.1)
g(char*s){
char** ps=&s;//也不行,它改变的还是拷贝得到的指针值
(2.2)
g(char*s){
&(s[0])=global;//编译不通过。

说明&(s[0])只能作为右值而不能作为左值出现在表达式中。尽管&(s[0])确实等于buf2的地址(跟s的地址已经没关系了)。
-------------------------------------------------------
欢迎大家讨论和斧正!
最近研究C专家编程这本书,发现以前对指针的认识太肤浅了。我在这里抛砖引玉了!

论坛徽章:
0
2 [报告]
发表于 2008-11-06 10:28 |只看该作者
支持原创

论坛徽章:
0
3 [报告]
发表于 2008-11-06 10:32 |只看该作者
(1) 不是你说的那个原因, 应该是函数参数的类型不一致造成的.
你换成这样的:

  1. char buf2[10]="efgh";
  2. void g(char (*s)[10]){
  3.         strcpy(s[0], global);
  4. }
  5. g(&buf2);
复制代码

就可以了.

论坛徽章:
0
4 [报告]
发表于 2008-11-06 10:38 |只看该作者
原帖由 scutan 于 2008-11-6 10:32 发表
(1) 不是你说的那个原因, 应该是函数参数的类型不一致造成的.
你换成这样的:

char buf2[10]="efgh";
void g(char (*s)[10]){
        strcpy(s[0], global);
}
g(&buf2);

就可以了.

谢谢,不过我想做的不是strcpy而是改变s的指向。呵呵
---------------------------------

[ 本帖最后由 jeanlove 于 2008-11-6 10:41 编辑 ]
x_xierr 该用户已被删除
5 [报告]
发表于 2008-11-06 11:10 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
x_xierr 该用户已被删除
6 [报告]
发表于 2008-11-06 11:25 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2008-11-06 11:26 |只看该作者
原帖由 x_xierr 于 2008-11-6 11:10 发表
不客气的说,你的两点认识都是错误的,对buf2[],&buf2根本就还是buf2,第二个不过是C语言传值调用的问题,你搞得太复杂了

哦,我是想用函数去改变buf2的指向,如果char**太复杂了,我该如何简化呢?

谢谢!

论坛徽章:
0
8 [报告]
发表于 2008-11-06 11:27 |只看该作者
第一点没明白,第二点简单的说就是函数g改变指针buf2的值吧,因为传给g的是指针buf2的地址。
x_xierr 该用户已被删除
9 [报告]
发表于 2008-11-06 11:31 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
10 [报告]
发表于 2008-11-06 11:32 |只看该作者
原帖由 carl_lau 于 2008-11-6 11:27 发表
第一点没明白,第二点简单的说就是函数g改变指针buf2的值吧,因为传给g的是指针buf2的地址。

第一点是说,静态数组的数组名是编译的时候确定的一个绝对数,无法在运行时取地址,所以不能&buf1

谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP