C语言深处

    返回首页    发表留言
本文作者:李德强
          第二节 指针参数
 
 

        先来思考这样一个问题如果有两个变量需要互换其值,应该如何处理?答案非常简单:

#include <stdio.h>

int main(int argc, char **args)
{
        int i = 3;
        int j = 5;

        int t;

        t = i;
        i = j;
        j = t;

        printf("i = %d\nj = %d\n", i, j);

        return 0;
}

        运行结果:

i = 5
j = 3

        如果我们有很多组变量都要做值互换,比如100组变量,我们肯定不能写100次的互换代码,首先方案就是要编写一个具有互换功能的函数swap,这个swap函数通过接收参数的方式将变量互换:

#include <stdio.h>

void swap(int m, int n)
{
        int t;

        t = m;
        m = n;
        n = t;
}

int main(int argc, char **args)
{
        int i = 3;
        int j = 5;

        swap(i, j);

        printf("i = %d\nj = %d\n", i, j);

        return 0;
}

        运行结果:

i = 3
j = 5

       运行结果错误,i与j的值并没有像我们预想的那样互换。原因是在void swap(int m, int n)中m和n是函数的参数,在main函数执行swap(i, j);时m和n只不过是得到了i和j的值,但m和n并不是i和j本身。当执行m和n互换时,m和n这两个变量的值的确互换了,但i和j并没有任何变化。对于整个程序来说i、j、m、n是4个不同的变量,它们之间没有任何关系。为了解决变量互换的问题,我们需要修改一下代码,将swap的参数修改为指针参数,修改后的程序如下:

#include <stdio.h>

void swap(int *m, int *n)
{
        int t;

        t = *m;
        *m = *n;
        *n = t;
}

int main(int argc, char **args)
{
        int i = 3;
        int j = 5;

        swap(&i, &j);

        printf("i = %d\nj = %d\n", i, j);

        return 0;
}

        运行结果:

i = 5
j = 3

        这次的结果是正确的,其实m、n和i、j一样都是没有关系的4个变量,但问题的关键是m和n都是指针变量,在调用swap函数时将i和j的地址传入到m和n中,也就是说m的值是i的内存地址,n的值是j的内存地址,在互换代码中并不是对m和n的值进行互换,而是对*m和*n做互换,也就是对m和n中的地址解引用并做互换操作,受到这个操作影响的就是这个地址中的2个变量i和j。于是i和j的值就互换了。

        指针做函数参数的好处很大,它允许在函数内部操作其外部的变量内容。同时,当一个函数的参数是指针时我们在编写程序时也要格外的注意,因为在函数内部修改函数外部变量是有一定风险的,要在明确知道函数功能的情况下才能调用这些指针做参数的函数。

        再来举一个指针变量做参数的例子,假设我们要给一个2维数组初始化,这个2维数组有5行10列,下面我们就来实现2个函数,init_array能让数组里的所有值都变为指定的数值,show_array能显示出这个数组:

#include <stdio.h>

#define MAX_ROW     5
#define MAX_COL     10

void init_array(int *p, int val)
{
        for (int i = 0; i < MAX_ROW; i++)
        {
                for (int j = 0; j < MAX_COL; j++)
                {
                        *p = val;
                        p++;
                }
        }
}

void show_array(int *p)
{
        for (int i = 0; i < MAX_ROW; i++)
        {
                for (int j = 0; j < MAX_COL; j++)
                {
                        printf("%d ", *p++);
                }
                printf("\n");
        }
}

int main(int argc, char **args)
{
        int array[5][10];

        init_array(array[0], 0);
        show_array(array[0]);

        printf("\n");

        init_array(array[0], 3);
        show_array(array[0]);

        printf("\n");

        init_array(array[0], 7);
        show_array(array[0]);

        return 0;
}

        运行结果:

0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 

3 3 3 3 3 3 3 3 3 3 
3 3 3 3 3 3 3 3 3 3 
3 3 3 3 3 3 3 3 3 3 
3 3 3 3 3 3 3 3 3 3 
3 3 3 3 3 3 3 3 3 3 

7 7 7 7 7 7 7 7 7 7 
7 7 7 7 7 7 7 7 7 7 
7 7 7 7 7 7 7 7 7 7 
7 7 7 7 7 7 7 7 7 7 
7 7 7 7 7 7 7 7 7 7 

 

    返回首页    返回顶部
  看不清?点击刷新

 

  Copyright © 2015-2018 问渠网 辽ICP备15013245号