c语言指针

int i,a[10];
int *p;
p=a;
scanf("%d",p);
printf("%d",*p);可以,

而int i,a[10];
int *p;
p=a;
p=7;/*重点在这*/
printf("%d",*p);为什么不可以。不是不可以给地址赋值吗。。困惑

第1个回答  2011-07-03
int *p;
是声明了一个指向int类型变量地址的指针变量,这个指针变量是专门用来存放其他int变量的物理地址的,你在下面p=a是对的,但是p=7是什么意思?你是怎么知道7是int变量的物理地址的?
printf("%d",*p);改为printf("%d",p[0]);追问

为什么scanf()可以给指针p赋值。而不能p=7。scanf输入的值给了地址p了啊。也相当于赋值了吧。。我不清楚了。。

第2个回答  2011-07-03
那好想不是给地址赋值,而是给指针赋值一个具体的数字,应该不对吧。*p=7;试试追问

我知道*p=7可以。但是我想知道的是我写的问题。。

追答

地址不能直接赋值,是自动分配的,和系统运行当时的存储化境有关,不是程序中应该调整的,只能做+n或者-n的幅值,比如可以写
int i,a[10],b;
int *p;
p=a;
p++;
p=b;//吧b的值赋给a[1];但是P的具体值是未知的,变化的,这样能理解么?

追问

为什么用scanf()函数可以给p赋值。。崩溃了。越来越乱。我就想知道这个

追答

你用scanf()的时候,系统帮你处理了指针的问题。实际上可以理解成执行了*p=a的动作。
以你的例子来说,
int i,a[10];
int *p;
p=a;
p=7;/*重点在这*/
你想做的是把值赋给P,还是P所指向的a[0],如果是后者的话,写*p=a;就行,如果是前者的话,你没有理解指针的作用。因为P的值是无关紧要的,它表示了a[0]在这个程序运行时的内存号(位置),这个每次都在变,也没有必要知道,指针的幅值是用在向我上一条回答里的移位读取或写入里,比如我上一条写的,我可以不知道P的具体值是多少,但P如果指向a[0],P+1就指向a[1],这样就够了,何必去管P是多少?打字太累了。。。。你可以看看书上说的,我说的不专业

本回答被提问者采纳
第3个回答  2011-07-03
通过地址向指定的存储区赋值的操作应该是:
*p = 7;
把语句修改一下就对了追问

你说的我知道。但是我弄不明白为什么scanf函数可以

第4个回答  2011-07-03
是&P