指针的使用场景

发布于 2021-09-15  93 次阅读


/*C语言进阶——指针的使用场景*/

//1、交换两个变量的值 
#include<stdio.h>
void swap(int *pa,int *pb);//形参为两个变量的地址

int action1(void){
	int a,b;
	printf("请输入两个值:\n");
	scanf("%d",&a);
	scanf("%d",&b);
	
	//调用交换函数swap()
	swap(&a,&b);
	printf("a=%d,b=%d",a,b); 
	return 0;
} 
void swap(int *pa,int *pb){
	int temp=*pa;
	*pa = *pb;//将pa与pb指向的内容交换
	*pb=temp; 
}

//二-1、 函数需要返回多个值(max,min),某些值只能通过指针返回
//传入的参数实际上是需要保存带回的结果的变量

void minmax(int a[],int len,int *max,int *min);
int action2(void){
	int a[]={1,2,3,4,5,6,7,8,9,10,11,2,56,878,154};
	int min,max;
	minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);//数组,元素个数,最小值地址,最大值地址
	 
	printf("min=%d,max=%d\n",min,max);
	return 0;
} 
//这里的minmax函数中的a[]其实是一个指针,它和action2中的a数组是
//同一个地址,并且修改后action2中的内容发生改变 
//即minmax(int a[],...) <-----> minmax(int *a,...) 


/*所以以下四种函数原型是等价的
int sum(int *ar,int n);
int sum(int *,int);
int sum(int ar[],int n);
int sum(int [],int); 

数组变量本身表达地址,所以
·int a[10];int *p=a;//无需用&取地址 
·但是数组的单元表达的是变量,需要用&取地址 
·a==&a[0]

[]运算符可以对数组做,也可以对指针做:
·p[0]<====>a[0]
*运算符可以对指针做,也可以对数组做:
·*a=25 

int b[] <----> int * const b一旦创建不能改变,所以两个数组不能赋值

指针可以是const那它所指向的内容也可以是const类型
         指针是const
·表示一旦得到了某个变量的地址,不能再指向其他的变量
·int *const q=&i;
·*q=26;//正确(给i赋值)
`  q++;	//错误,因为指针本身是const

 		指针所指是const
表示不能通过这个指针去修改那个变量(并不能使得那个变量成为const)
const int *p=&i;//不能通过*p修改i的值
*p=26;//错误,因为(*p)为const类型 
*/
void minmax(int a[],int len,int *min,int *max){
    int i;
    *min=*max=a[0];//设最大与最小值均为数组第一个元素
	for(i=1;i<len;i++)
	{
	   if(a[i]<*min){
	   	 *min=a[i];
	   }	
	   if(a[i]>*max){
	   	 *max=a[i];
	   }
	} 
}
//二-2 函数返回运算的状态,结果通过指针返回 
//常用的套路是让函数返回特殊的不属于有效范围内的值来表示出错
int divide(int a,int b,int *result);
int action2_2(void){
	int a=5;
	int b=2;
	int c;
	if(divide(a,b,&c)){
		printf("%d/%d=%d\n",a,b,c);
	}
	return 0;
} 
int divide(int a,int b,int *result){
	int ret =1;//ret为函数的返回值 
	if(b==0) ret=0;
	else{
		*result=a/b;//而主函数中还会用到具体的除法具体的结果,
			//所以这里采用指针返回具体的除法运算的结果 
	}
	return ret;
}
//指针常见的错误:定义了指针变量,还没有指向任何变量,就开始使用指针 



int main(void){
	
    action2_2(); 
	
	return 0;
}


本当の声を響かせてよ