淘先锋技术网

首页 1 2 3 4 5 6 7

1.指针的应用场景一
交换两个变量的值
int swap(int *pa,int *pb)
{
int t=*pa;
*pa=*pb;
*pb=t;
}

代码:

void swap(int *pa,int *pb);
int main()
{
    int a=5;
    int b=6;
    swap(&a,&b);
    printf("a=%d,b=%d\n",a,b);//a=6,b=5
    return 0;
}
void swap(int *pa,int *pb)
{
    int t=*pa;
    *pa=*pb;
    *pb=t;
}

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

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);//min=1,max=55
    return 0;
}
void minmax(int a[],int len,int *min,int *max)
{

    int i;
    *min=*max=a[0];//先让*min和*max等于a的第一个元素
    for(i=1;i<len;i++){//从第二个元素开始遍历整个数组
        if(a[i]<*min){
            *min=a[i];
        }
        if(a[i]>*max){
            *max=a[i];
        }
    }
}
3.指针应用场景3
函数要返回运算的状态,结果通过指针返回

常用的套路是让函数返回特殊的不属于有效范围内的值来表示出错:
-10(在文件操作会看到大量的例子)
但是当你的函数的任何数值都是有效地可能结果时,那么你就无法通过返回值来表达你的运算是否正确了,就得分开返回了
分开返回往往是状态用函数的return来返回,而实际的值通过指针参数来返回

//return如果除法成功,返回1,否则返回0
int divide(int a,int b,int *result);//a/b,相除的结果通过指针result来返回,
//但其也有返回值,它的返回值是如果除法成功返回1,否则返回0
//为什么会有想除不成功,比如除数是0,就让返回值为0,就不再去做运算了
int main(void)
{
    int a=5;
    int b=2;
    int c;
    if(divide(a,b,&c)){//如果divide是成功的,进入运算
        printf("%d/%d=%d\n",a,b,c);//5/2=2
    }
    return 0;
}
int divide(int a,int b,int *result)
{
    int ret=1;
    if(b==0) ret=0;
    else{
        *result=a/b;
    }
    return ret;
}

后续的语言(C++,Java)采用了异常机制来解决这个问题

4.指针最常见的错误
定义了指针变量,还没有指向任何变量,就开始使用指针

void f(int *p);
void g(int k);
int main()
{
    int i=6;
    int *p=0;
    int k;
    k=12;
    *p=12;//Segmention fault:
    //写到int *p这一步时,p里这时是没有东西的,,它还没有和任何具体的变量联系在一起,它还没有被赋以一个实际的值
    //而在此时就*p=12;的话,所有的本地变量都不会有默认的初始值,如果没有对它做过赋值,这个本地变量里可能是ab23等等乱七八糟的值
    //于是如果把那个乱七八糟的值当做地址,它可能会指向一片莫名其妙的地方,*p=12就是往那个地方写入12,
    //若碰巧那个地方是不能写入的地方,则程序崩溃
    printf("&i---i的地址是%p\n",&i);
    f(&i);
    g(i);
    return 0;
}
void f(int *p)
{
    printf("p=%p\n",p);
    printf("*p=%d\n",*p);//*p=6
    *p=26;
}
void g(int k)
{
    printf("k=%d\n",k);//k=26,意味着在经历了f函数的调用后,i的值被改了