1.指针是什么?
指针是一种保存变量地址的变量。
在计算机中每个存储单元(一个字节)都有一个编号,这个编号称为变量地址。
普通变量的值就是实际值,指针变量的值是变量的地址
- 取地址 &
#include<stdio.h>
main(){
int a=0;
printf("%p\n",&a);
}
- 说明
1.&: 在变量前面加&,可以表示获取变量的地址
2.%p: 是地址的输出格式符
PS: 变量的地址通常采用16位进制数表示
2.指针的使用
2.1 定义指针
定义指针的形式与定义普通变量基本一样,只需在变量名和数据类型之间加*
#include<stdio.h>
main(){
int a=0;
int* p;//定义一个int型的指针p
p=&a;//将a的地址赋给指针变量p
printf("%d\n",*p);//输出结果是a
}
指针变量只能用同类型的变量赋值
也可以对指针直接进行初始化,如下:
#include<stdio.h>
main(){
int a=0;
int *p=&a;
printf("%d\n",p);//输出为十进制数的地址
printf("%p\n",p);//输出为十六进制数的地址
printf("%d\n",*p);//输出为0
}
指针和变量一样,必须是赋值之后才可以使用
非法格式如下:
int a=0;
int *p=a;//这是非法的,对指针初始化时,给指针赋的值必须是地址
- 引用
int a=0;
int &p=a;//这里p是a的引用,可以当作p是a的别名
printf("%d\n%d\n%d\n%d",a,p,&a,&p);//前面两个输出是0,后面两个输出的是a的地址
注意
**这里这里要十分注意区别取地址和引用,&作为引用主要是在变量的声明,也就是将此变量作为一个别名,两者的内存地址完全相同
- 解引用(*)
#include<stdio.h>
main(){
int a;
int *p;//这里*的作用是定义p为指针
p=&a;//这里&是取a的地址
*p=8;//这里*是解引用
printf("%d\n",p);
}
- 引用和解引用的复合使用
#include<stdio.h>
main(){
int *&r=p;//这里r是对p的引用
}
本课需十分注意* 和&的真正含义,当时我面试学校实验室的时候,学长问我这是什么意思,我当时只说就是读出此地址的值,当时我还没有接触到引用和解引用这两个名词,也不知道是什么,还有就是看再多的书也不一定会有用,该实践还是要动手,理论和实践还是有很大的差距 ,fighting!