LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1069|回复: 15

感到C的指针格式好难记。

[复制链接]
发表于 2003-10-11 20:50:01 | 显示全部楼层 |阅读模式
原理不难理解,就是觉的使用的格式难记。

如:
int i,*p;
p=&i;   /*     使指针变量p指向变量i     */
int a=1,*p1=&a;           

这里的P=&i 和*p1=&a  不是矛盾吗?
怎么一个不要 *    另一个要*   ??
发表于 2003-10-11 21:04:17 | 显示全部楼层
最后一行的*p1=&a应该为*p1=a吧?

不带*的是地址,带*的和那个变量没什么区别!

我也不是行家,仅供参考!共同学习。。。
 楼主| 发表于 2003-10-11 21:21:07 | 显示全部楼层
我想明白了。谢谢。
这是同时定义和赋值。定义了指针*p有赋了值。格式可以写成上面那样的。

还有一些不明白的。

从书上抄的:
设有变量*a   , 指针变量pa  ,且pa  已经指向 a.

*&a   正确的。相当于*(&a),&a是变量a的地址,*(a地址)代表变量a.
*&pa 正确的。相当于"*(&pa)",&pa是pa的地址,*(pa地址)代表指针变量pa.

"设有变量*a   , 指针变量pa"
这是指针变量吗? 和后面的“ 指针变量pa "  有什么不同??
发表于 2003-10-11 21:22:25 | 显示全部楼层
最后一行应该没错吧。
相当于
  1. int a=1;
  2. int *p1=&a;
复制代码
发表于 2003-10-11 21:31:46 | 显示全部楼层
最后一行应该没错吧。
相当于
  1. int a=1;
  2. int *p1=&a;
复制代码
发表于 2003-10-11 21:31:47 | 显示全部楼层
应该把变量声明和一般赋值语句分开看,你可以理解为两个运算符是不同的,
char *p = &i;
这里的*是个声明符,表明p是个指针
*p = 1;
这里的*是间接运算符
i = 2 * 3;
这里的*是乘法运算符
在这里C语言专门把指针的声明和间接运算设计成一样的,不过也容易把人搞糊涂。
发表于 2003-10-11 21:49:34 | 显示全部楼层
俺错了吧。。。。(认了错先。。)

是不是这样,
*p1=&a
相当于

int *p1;
p1=&a;或者*p1=a;
 楼主| 发表于 2003-10-11 21:50:42 | 显示全部楼层
上面的都是照书抄的。
# gcc -c t0.c
t0.c: In function `main':
t0.c:4: warning: initialization makes pointer from integer without a cast
t0.c:6: error: `p' undeclared (first use in this function)
t0.c:6: error: (Each undeclared identifier is reported only once
t0.c:6: error: for each function it appears in.)
# cat t0.c
main()
{
int a=1;
int *p1=a;
/*scanf("%d",&i);*/
printf("%d\n",*p);

}

#

感到指针的使用格式真的是混乱,  
有人能详细说说吗?

对不起,我这里网速很慢,不知道fingster已改正。
-----------------------------------------------------------
# cat t0.c
main()
{
int a=1;
int *p1=&a;
printf("%d\n",*p1);

int b=2,*p2;
p2=&b;
printf("%d",*p2);

int c=1,j=2,k,*p3=&c;
k=*p3+j;
printf ("%d",k);
}
# gcc -c t0.c
#
这些都是对的,    ” k=*p3+j; “这里,既然*是声明p3是指针,怎么这里还要这样用?  
发表于 2003-10-11 22:58:49 | 显示全部楼层
是不是这样,
*p1=&a
相当于
int *p1;
p1=&a;或者*p1=a;

p1=&a;对
*p1=a;不对,p1是指针,int *p1;没有初始化,p1指向的地址不定,
p1=&a;使p1获得a的地址,也就是指向a,
*p1=a;把p1指向的地址的内容改成a的值,而此时p1指向的地址是不确定的,不知道会修改什么位置。
发表于 2003-10-11 23:01:23 | 显示全部楼层
k=*p3+j; “这里,既然*是声明p3是指针,怎么这里还要这样用?

在声明语句里*是声明符,在其他语句里*是间接符,这条语句的*p3是取p3指向的地址的内容
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表