p是指针变量,*p=a和p=&a的区别

#include<stdio.h>
void main()
{
int a,b;
int *pa,*pb;
a=10;b=20;
*pa=a;*pb=b;
printf("%d,%d\n",*pa,*pb);
printf("%x,%x\n",pa,pb);
printf("%x,%x\n",&a,&b);
}
结果输出为:
10,20
354,7d5
ffda,ffdc
为什么程序最后两行输出的结果不一样呢?按说应该都输出a和b的地址才对。。谢谢

分清是语句里还是声明里。
声明 里 int *p=a; 声明 *p 是 int 型指针,初始化,让 p 指向 a [数组] 的始地址。
声明 里 int p=&a; 声明 p 是 int型变量,不是指针,初始化,把变量 a 的地址 &a 赋给 p.
语句里,若 p 是指针变量,
*p=a; *p 表示 值,把 变量 a 的当前值 赋给 指针。(指针指向的地址不变)。
p = &a; p 表示指向的地址, 把 变量 a 的地址 &a 赋给 p, 也就是让指针指向 变量 a。

例如:
int a=2, b=3;
int *p=&b; // 指针指向地址 初始化, 指向 b
printf("address: %p value:%d\n", p, *p); //输出地址同 b, 数值 3
*p=a;
printf("address: %p value:%d\n", p, *p); //输出地址同 b, 数值 2
p= &a;
printf("address: %p value:%d\n", p, *p); //输出地址同 a, 数值 2
---------------------
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-02-16
这段代码在一些编译器是编译不过的,因为你没有给pa,pb赋值,pa,pb两个指针指向哪里,根本不知道
*p=a 和 p=&a是完全不同的两码事
*p 是 p 指向的地址的值,改变了值不是改变了它的地址,而p=&a就是改变p所指向的地址,使之指向a
举个例子说明一下
p=&a; //p保存的是a的地址
*p=b; //并不是p保存了b的地址,而是将b的值保存到p所指向的地址的那个值,这句相当于a=b,最后改变了a的值,而非p所指向的地址
第2个回答  推荐于2018-03-08
1
*p=a; //表示将a的值赋给p所指单元。
p=&a; //表示将p指向a单元,即将a单元的地址赋给p。

2

int a,b;
int *pa,*pb;
a=10;b=20;
*pa=a;*pb=b; //这两个语句有问题。pa,pb是野指针,没有指向任何单元。
printf("%d,%d\n",*pa,*pb);
printf("%x,%x\n",pa,pb); //pa,pb的野指针,其值不确定。
printf("%x,%x\n",&a,&b); //输出a,b的地址。本回答被提问者和网友采纳
第3个回答  2012-02-16
区别很明显,*pa=a,*pb=b只是说内存pa位置存放的值是等于a并不是pa指向变量a的地址单元,因此输出的地址是不一样的。
第4个回答  2012-02-16
最关键的错误在pa和pb这两个指针没有初始化,
当执行*pa=a;*pb=b;时结果不可预期, 很可能程序应崩溃掉的.
相似回答