一、指针的概念
内存单元的编号也叫做地址,既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址成为指针。
(说白了指针就是地址,也是上面说的内存单元编号)。
二、指针变量
在 C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为内存单元的指针。
* 指针是一个地址,是一个常量。
* 指针变量存放的是一个地址,是一个变量。
1、定义指针变量
形式:类型说明符 *变量名;
解释:*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。
例如:int *pi;
注意:
(1)“*”必须要有,如果没有就相当于定义了一个普通变量。
(2)指针变量不能存放数值或者字符之类的数据,只能存放地址。
(3)指针变量,归根结底还是变量,也有全局、局部变量之分。
2、指针变量的初始化
(1)定义的同时初始化
1)完全初始化
int *p=&a; //p指向了a
2)部分初始化
int *p=&b,*p2;
(2)先定义,后初始化
int *p;
p=&a; //注意这里是p,不是*p,*p指向的是内存单元的值
(3)如果定义了一个指针变量,但是我不知道让这个指针指向谁
int *p=null;
int *p2=0;
(4)指针变量如果不初始化会有什么后果?
int *p; //值是一个垃圾值,有可能存放是系统程序的地址
//可能会造成系统崩溃
//结论:如果一个指针变量定义以后,如果不进行初始化,这个指针变量存放的是一个垃圾数,这个指针变量,我们称之为野指针。
//一定要避免操作野指针,因为可能会带来意想不到的错误。
3、用*来获取指针变量指向的存储单元的内容
int value=*p;
总结:
“*”的两种用法
(1)用于定义个指针变量
(2)***存取指针变量所指向的存储空间的内容(存取值)。
例:int a=4;
int *p=&a;
int value=*p; //value=4
*p=100;
value=*p; //value=100,a=100
练习:使用函数、指针将两个变量的值交换
void swap(int *p,int *p1){
int temp;
temp = *p;
*p = *p1;
*p1 = temp;
//为什么不用以下写法?
//int *temp;
//temp=p;
//p=p1;
//p1=temp
//以上交换的是两个值的地址,而不是地址的值。
//当程序结束之后,属于本函数的内存失效,地址交换失败。
//所以要交换两个变量对应内存地址中的值
}
void main(){
int a=3;
int b=4;
printf(“a=%d,b=%d”,a,b);
swap(&a,&b);
printf(“a=%d,b=%d”,a,b);
}
总结:
以上内容所讲,无非4句代码。
int a=10; //创建int类型变量
int *p=&a; //创建指针变量p,指向a。因为指针变量指向的是地址,所以是int *p=&a;
*p = 100; //*p既可以取值也可以赋值,此处是给*p赋值,值是100.
int b=*p; //*p将存储在对应内存地址中的值取出,再赋值给整型变量b。
* 注意:p表示指针(地址),*p表示地址的值
4、常见的应用场景
(1)在被调函数中可以修改主调函数的值
代码见总结部分之上的代码。
(2)让函数可以有多个返回值
void caculator(int x,int y,int *add,int *jian,int *cheng,float *chu){
*add=x+y;
*jian=x-y;
*cheng=x*y;
*chu=x/(float)y;
}
void main(){
int add=0;
int jian=0
int cheng=0;
float chu=0.0f;
caculator(10,12,&add,&jian,&cheng,&chu);
printf("add=%d\n",add);
printf("jian=%d\n",jian);
printf("cheng=%d\n",cheng);
printf("chu=%.2f\n",chu);
} |
|