1. 什么是指针?
定义:指针是一种保存变量地址的变量。
在计算机中每个存储单元(一个字节)都有一个编号,这个编号称为变量地址。指针的作用就是用来存放变量的地址。
普通变量的值是实际值,指针变量的值是变量的地址。
对变量取地址:
在变量名字前面加上&,表示获取变量的地址;
int n = 10;
printf("&n=%p\n",&n); //取变量n的地址,使用%p打印,十六进制表示
printf("n=%d\n",n); //取变量n的值
2. 指针的使用
2.1 指针的定义
定义指针与定义变量的方式一样,只不过要在类型和变量名中间加上一个*星号。
类型* 指针变量;
指针变量只能使用同类型变量的地址赋值。
int n = 10;
int* p;
p = &n; //p和n是同类型的变量,才能进行地址赋值
printf("&n=%p\n",p);
printf("n=%d\n",n);
指针可以直接在定义的时候进行初始化。
int n = 10;
int* p = &n; //直接初始化
printf("&n=%p\n",p);
printf("n=%d\n",n);
注意:
不论是指针还是变量,必须赋值后才能使用。
2.2 解引用
指针可以直接操作储存地址里面的数据。这种操作称为解引用。使用时需要在指针前加上*星号。
int n = 1;
int* p = &n;
printf("n=%d\n",n); //n=1
printf("*p=%d\n",*p);//*p=1
n = 10;
printf("n=%d\n",n);//n=10
printf("*p=%d\n",*p);//*p=10
*p = 100;
printf("n=%d\n",n);//n=100
printf("*p=%d\n",*p);//*p=100
//在这里对*p操作就是对n操作;对n操作就是对*p操作。
注意:
这里的*与声明指针的含义不一样,与乘号也不一样。
访问变量两种方式:一是通过变量名直接访问,而是指针解引用访问。
对地址的解引用就是求地址内所对应的值。
3. 指针与函数
3.1 函数中的值传递
#include<stdio.h>
int func(int n){
n = 1;
}
int main(){
int n = 0;
printf("func(n)=%d\n", func(n);
printf("n = %d\n",n);
}
运行结果:
func(n)=0
n = 0
以上的运行结果可知,通过定义的变量进行函数的值传递时,只是将函数的值传递进函数,在函数里使用该值,但是函数外,该局部变量的真实值没有发生改变。
3.2 指针/地址
若想通过传递参数在函数内部改变函数外部定义的局部变量时必须满足两个条件:
(1) 使用指针作为函数传递的参数
(2) 解引用
#include<stdio.h>
int func(int* m){
*m = 1;
return *m;
}
int main(){
int n = 0;
printf("func(&n)=%d\n", func(&n));
printf("n = %d\n",n);
}
运行结果:
func(&n)=1
n = 1
学习体会:
以上程序将局部变量n的地址传入了函数,那么函数会对变量进行操作。也就是说,以指针进行参数传递时会改变变量的值,而以变量形式对函数进行传参时,不会改变变量的值!