指针的一些使用方法(笔记)

指针使用一:交换两个变量的值

#include <stdio.h>

void swap(int *pa, int *pb);

int main()
{
	int a = 5;
	int b = 6;
	swap(&a, &b);
	printf("a=%d,b=%d", a, b);
	
	return 0;
}

void swap(int *pa, int *pb)   //实际是将外部的两个变量的地址传入函数内
                              //在函数的内部对外边的两个变量进行值的操作,实际起到传入传出的作用
{
	int t = *pa;
	*pa = *pb;
	*pb = t;
}

指针使用二a:
函数返回多个值,某些值就只能通过指针返回
传⼊入的参数实际上是需要保存带回的结果的变量

#include<stdio.h>
void minmax(int a[]int len, int *max,int *min);
int main(void)
{
	int a[] = {1,2,3,4,5,6,7,8,9, 12,13,14,16,17,21,23,55,};
	int min, max;
	minmax(a, sizeof(a)/sizeof(a[0]), &min, &max);
	printf("min=%d, maX= =%d\n", min, max);
	return 0;
}
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] ;
		}
	}
}

指针应用场景二b
• 函数返回运算的状态,结果通过指针返回
• 常用的套路是让函数返回特殊的不属于有效范围内的
值来表示出错:(程序的运行是否正确,通过返回特定的值,而需要的结果通过指针返回)
• -1或0(在文件操作会看到⼤大量的例子)
• 但是当任何数值都是有效的可能结果时,就得分开返
回了
• 后续的语言(C++,Java)采用了异常机制来解决这
个问题
例如:

#include <stdio. h> 
/**
@return如果除法成功,返回1;否则返回0
*/
int divide(int a, int b, int *result);//所定义函数的结果,用指针返回,函数是否成功进行了计算,用0和1返回,成功返回1,不成功返回0
int main(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;定义一个初始状态
	if( b== 0)ret = 0;  如果除数为零,则本次计算未成功,返回0表示计算错误
	else {
	*result = a/b;
	
	return ret;
}

最常见的错误
• 定义了指针变量,还没有指向任何变量,就开始使用
指针
int p;即定义的指针是一个本地变量(局部变量或者自动变量),如果没有人为的初始化,这种变量是自动赋值的,这样定义的形式是表示定义了一个指针,但是指针所表示的地址是随机的,不能将其进行赋值操作(如p=5),因为如果在某一次运行时,指针的地址恰好指向计算机内某一个关键的地址,进行赋值操作后,程序会崩溃或者出现错误提示

任何一个地址变量,在没有赋值之前,进行访问,都是没有任何意义的

int *p = &a;  //表示定义了一个指针,同时给这个指针变量赋值为a的地址
/*等效于*/
int *p;    //表示定义了一个指针变量
p = &a;     //给这个指针变量赋值为a的地址

两种写法的理解可参考
https://blog.csdn.net/weixin_37386610/article/details/8890925

https://blog.csdn.net/qq_25814297/article/details/98032161

以下程序为错误应用

#include <stdio. h>
void f(int *p);
int main(void)
{
	int i=6;
	int *p=0;  //表示定义了一个指针且地址为0
	int k;
	k =12;
	*p = 12;   //向地址为0的地方写入值12,一定会出现错误提示
	printf("&i=%p\n", &i);
	f(&i);
	return 0;
}
void f(int *p)
{
	printf(" p=%p\n", p);
	printf("*p=%d\n", *p);
	*p = 26;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值