C语言中指针初始化的必要性(以指针做参数进行交换)

首先看一段代码

#include<stdio.h>
void swap(int* a,int* b)
{
    int* temp;
    *temp=*a;
    *a=*b;
    *b=*temp;
}
int main()
{
    int a=1,b=3;
    int *p,*q;
    p=&a;
    q=&b;
    swap(p,q);
    printf("%d %d\n",a,b);
    printf("%d %d\n",*p,*q);
    return 0;
}

这段代码是交换两个数的经典问题的代码,看上去好像没有问题,但是在运行之后你会发现代码没有运行结果,其实问题就出在指针的初始化问题之上。我们看修改之后的代码。

#include<stdio.h>
void swap(int* a,int* b)
{
    int x;
    int* temp;
    temp=&x;//temp的初始化
    *temp=*a;
    *a=*b;
    *b=*temp;
}
int main()
{
    int a=1,b=3;
    int *p,*q;
    p=&a;
    q=&b;
    swap(p,q);
    printf("%d %d\n",a,b);
    printf("%d %d\n",*p,*q);
    return 0;
}

我们只是增加了temp=&x这一内容,我们发现此时的代码可以运行了。
其实问题就出在指针初始化上面,指针没有初始化的时候会有一个随机指向的地址,这个地址可能是系统的工作空间,这时候是不允许修改的,所以我们的程序很大可能不会出现运行结果。
所以我们只要为temp初始化就可以很容易得到交换之后的结果。
当然,我们可以用更简洁的办法实现交换。

#include<stdio.h>
void swap(int* a,int* b)
{
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}
int main()
{
    int a=1,b=3;
    int *p,*q;
    p=&a;
    q=&b;
    swap(p,q);
    printf("%d %d\n",a,b);
    printf("%d %d\n",*p,*q);
    return 0;
}
发布了17 篇原创文章 · 获赞 16 · 访问量 1174

猜你喜欢

转载自blog.csdn.net/XYshaonianhaofang/article/details/104118935
今日推荐