首先来说一下*和&,为了便于理解你可以认为,这里*是取内容,&是取地址。
我不讨论它们的区别,因为*p=&a这个形式一般是错的,常用的是p=&a。
下面比较*p=a和p=&a。看图,图很详细。
显然它们是等价的。
然后比较*p=&a和p=&a;
则这两种都是对指针变量的赋值,赋值有两种形式
①先定义后赋值
int a=3,*p;(定义指针变量*p)
p=&a;(对指针变量取地址)
②定义变量的同时赋值
int a=3,*p=&a
也就是说在赋值时,
int *p=&a
相当于
int *p,
p=&a
它们的区别其实就是
int *p=&a是同时定义*p并对赋值p(即a的地址赋给P),而p=&a,只是对P赋值,没有定义指针变量。
但要注意,只有在同时定义赋值时“*p=&a”这种写法才是对的
其他情况下不要用*p=&a,这种形式,因为根本就不对,如下图。我之前一直的疑问是为什么赋值时*p=&a就不算错了?后来老师给的解释是这种形式只有在上面那种情况下成立,其他的情况确实都是错的。
c语言中*p=a是指针变量赋值语句,这种写法有两种可能意思:
指针变量定义时的初始化赋值
int a[10];
int *p=a ; //这时的a是个地址,如:数组名或指针变量,表示定义指针变量p,同时,p指向地址a。 这里的*是跟随int的,用来表示p变量是int *类型。
指针变量定义后,给指针变量所指内存中的数据赋值
int a=10, x;
int *p ;
p=&x ; //p指向变量x的地址
*p=a ; //这表示向p所指向的地址中存储一个数据a,a是个整型数据。p是x的地地址,*p就是x,本句相当于x=a ;
这里的*是指针变量引用操作运算符,表示引用指针中的数据
注意:
p=&x ; 很重要,指针变量必须要指向一个明确的地址,然后才能*操作,否则,未指定地址的指针变量被称为野指针,引用野指针会造成程序运行异常。