- 论坛徽章:
- 0
|
一个小程序用来试探指针的世界
> 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专家编程这本书,发现以前对指针的认识太肤浅了。我在这里抛砖引玉了! |
|