指针使用一:交换两个变量的值
#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;
}