两个差不多的指针有什么不同?

来源:百度知道 编辑:UC知道 时间:2024/05/23 15:04:37
int *p=a;p指向a的地址
int *p=&a;p指向a

他们俩有什么不同吗?他们为什么是表示那样?p都是a的地址吧,

请深入的讲讲

int *p=a;是指针的初始化,这里指针p的值是a(也就是a是一个地址)
而int *p=&a;中,指针p的值是a的地址(这里的a不表示地址,&a才是表示地址)

第二条中的p才是a的地址,定义并初始化 和 定义,然后赋值是不一样的.

int *p = &a; 和int *p; p = &a; 效果上是一样的,
不过第一种效率要高一些,
因此一般有经验的程序员都喜欢用定义并初始化的方式,
即使不能用第一种的方式,第二种也要写成
int *p = NULL; p = &a;
这样的习惯可减少出现野指针(未经初始化或指向无效地址的指针)的风险。

分情况看:
1,如果a是一个变量;
int *p=a; 出错;
int *p=&a;正确 p指向a的地址;
2,如果a是一个数组;
int *p=a; 正确 p指向a的地址;
int *p=&a;正确 p指向a的地址 ;

这是对指针p作初始化处理,指针也是个变量,它有两个方面要尤其注意:1、指针本身的值,这是个物理地址2、指针指向的变量的值,这是那个变量本身的值。
所以把你给出的例子具体给个值看看,并且把初始化语句分成两条来看,你就明白了,例如:
先定义好a的值是100,a的地址假设说是0x00016;
将int *p=a;
等效为 int *p;
p=a;
那么p就等于100,相当于给指针p这个变量赋值为100;
将int *p=&a;
等效为 int *p;
p=&a;
那么p就等于0x00016,相当于将a的地址赋值给指针变量p,因为&是取地址运算

int *p=a;怎么感觉语法不对呢?好象不能这么同时服值
int *p=&a;P指向a的地址,打印printf("%d",a);和printf("%d",*p);都是打印a的值
printf("%x",p);打印a的地址