指针的定义及作用

目录

一.指针

二.操作其他函数中的变量

三. 函数返回多个值       

 四.函数的结果和计算状态分开


一.指针

        指针全程其实是指针变量,也就是说它是一个变量,里面存储的就是内存地址。 它的定义格式如下:

        数据类型 * 变量名

        其中,数据类型要跟指向变量的类型保持一致。如:

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;
}

上面这段代码就体现了我们指针的第三大作用,能够将计算结果和计算状态分开。

 

        

 

 

        

 

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值