定义!:
指针本身就是一个地址,首先要清楚一点什么是指针:
int *p; 这里* p不是指针,p才是指针!所以指针p是一个地址,而*p是地址里的内容。这一块是定义,记住就行,接着往下看。
*是取值符号,&是取址符号
举例:
void test2(){
int a = 3;
int *b;
b = &a;
printf("%p\n",b); //out:a
printf("%p\n",&a);//out:a的地址
printf("%d",*b); //out:b指向的地址(既是a的地址)
printf("%p\n",&b);//out:b的地址
}
b是指针,也就是一个地址,可以用%p输出其地址值;
&a是取出数值a的地址,故可以赋值到b;
最后是b和&b的区别:
b是指针,指向的是&a,也就是说,指针b就是&a;&b是指针b自己的地址。(这里出现了两个地址,一个是别人的地址(b),一个是自己的地址(&b),注意区分)
接下来是练习:
void test3(){
int x = 4,y = 5;
int *a , * b = &y;
a = &x;
printf("%d\n",*a);//输出4?
printf("%d",*b);//输出5?
}
结果:
练习:
void test1(){
int *p;
*p = 4;
printf("%p\n",p);
printf("%d",*p);
}
结果:没有输出结果
分析:*p被声明后,没有被初始化,此时p指向的是一个随机的地址,对于一个随机的地址不能修改其值 ,故直接改变p的内容是不行的,因为这里p并没有一个确定的地址。
练习:
void test4(){
int b= 10;
int *q;
*q = &b;
printf("%d",*q);
}
结果:
分析:应该很简单了,这里*q是数值,而&b是一个地址,当然会报错
那么我们来修改一下:
void test5(){
//改test4
int b= 10;
int *q;
q = &b;
printf("%d",*q);
}
结果正确: