目录
一.指针
指针全程其实是指针变量,也就是说它是一个变量,里面存储的就是内存地址。 它的定义格式如下:
数据类型 * 变量名
其中,数据类型要跟指向变量的类型保持一致。如:
int a=30;
int* p1=&a;
其中,变量a的数据类型是int类型,所以就得写成int*。并且把变量a的地址赋值给p1。
由于我们只是把变量a的地址传递给了p1,那要怎么得到变量a里面的值呢?
很简单,我们只需要对它进行解引用就好了,这里我们的解引用运算符为*。如下所示:
int a=30;
int* p1=&a;
printf("%d\n",*p1);
这里printf语句中的*跟前面那一个*可不一样了,前面那个*只是为了说明这是个指针变量。而这里的*则表示把p1地址里面的值给取出来,最后打印的结果也就是30。
这也是指针的第一个基本作用,进行数据的查询。
第二个基本作用为存储数据,它的格式为:*指针名=数据值; 这就表示这个指针名所存储的地址对应的数据发生了改变,变为了赋值的新数据。
值得注意的是:指针变量所占用的字节大小,跟数据类型无关,只跟编译器有关系。如32位的编译器它所占用的字节为4字节,而64位的编译器所占用的字节则是8个字节。
在上面介绍了指针跟它的两个基本作用之后,我们现在来掌握下指针剩下的三个作用,分别是1)操作其他函数中的变量;2)函数返回多个值;3)函数的结果和计算状态分开。
二.操作其他函数中的变量
首先我们来了解第一个作用。下面我们来看一段代码:
int main(){
//定义两个变量
int a=10;
int b=20;
//调用这个交换函数
swap(a,b);
printf("交换后的数据为:%d,%d",a,b);\
return 0;
}
void swap(int num1,int num2)
{
int temp=num1;
num1=num2;
num2=temp;
}
我们看了上面一段代码之后,会觉得变量a和变量b的值已经发生了改变,但程序真正的运行结果却还是原来的值,也就是没有发生交换。
这是为什么呢?就是因为我们在调用这个交换函数的时候,只是把a,b的值给传递了过去,因此在a,b两个变量的内存地址中的真实值并没有发生改变。这也就能体现我们指针的第一大作用了,下面我们来看下利用指针进行修改了之后的代码:
int main(){
//定义两个变量
int a=10;
int b=20;
//调用这个交换函数,交换函数的代码在下面
swap(&a,&b);
printf("交换后的结果为:%d,%d",a,b);
return 0;
}
//交换函数
void swap(int* p1,int* p2){
int temp=*p1;
*p1=*p2;
*p2=temp;
}
这里我们更改了交换函数的形参,使它接收两个指针变量,同时,我们在主函数里面调用这个函数的时候,传递的也不是数据了,而是这两个变量的内存地址。这样我们在交换函数里面交换的数据就是这两个变量真实的数据了。
值得注意的是:任何函数中的变量都是有生命周期的,如果你想在函数结束之后,继续使用里面的变量,你就只需要在变量前面加上static这个关键字。
三. 函数返回多个值
在编写程序的时候,如果我们需要编写一个计算数组最大值和最小值的函数,这个时候我们求出最大值和最小值并不难,但是由于返回值return 一次只能返回一个值,所以我们就不能返回我们所计算出来的最大值和最小值。如下所示:
//这是计算数组中最大值和最小值的一个函数,其中len就是数组的长度
int getMaxMin(int arr[],int len){
int max=arr[0];
for(int i=1;i<len;i++){
if(arr[i]>max){
max=arr[i];
}
}
int min=arr[0];
for(int i=1;i<len;i++){
if(arr[i]<min){
min=arr[i];
}
}
}
这个时候 我们就可以使用我们的指针来返回多个值,它的原理其实就是得到max的值,然后直接通过指针来赋值给主函数中的变量。
下面我们来看下修改之后的代码:
int main(){
int arr={1,2,3,4,5,6};
int len=sizeof(arr)/sizeof(int);
int max=arr[0];
int min=arr[0];
getMaxMin(arr,len,&max,&min);
return 0;
}
void getMaxMin(int arr[],int len,int* max,int* min){
int *max=arr[0];
for(int i=1;i<len;i++){
if(arr[i]>*max){
*max=arr[i];
}
}
int *min=arr[0];
for(int i=1;i<len;i++){
if(arr[i]<*min){
*min=arr[i];
}
}
}
这里我们在原来的基础上给getMaxMin函数新增了两个指针变量,通过将主函数中max和min的内存地址传递给函数来直接修改里面的值。这就是利用指针来返回多个值的思路。
四.函数的结果和计算状态分开
指针这个作用就是在你需要返回一个计算结果,但又需要返回一个表示计算结果正常计算的标志的时候,就可以用到这个功能。
下面我们来看它的代码:
int main(){
}
//因为我们在进行除法运算的时候,除数是不能为0的
//因此我们要是输入的num2为0的时候,我们就返回0,表示不行
int getRemainder(int num1,int num2,int* res){
if(num2==0){
return 0
}
//将运算的结果直接传递给指针变量的地址当中去,不需要return
*res =num1/num2;
return 1;
}
上面这段代码就体现了我们指针的第三大作用,能够将计算结果和计算状态分开。