指针变量的使用场合及常见的使用方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

指针变量的使用场合及常见的使用方法

一、处理简单变量(这里的简单变量指的是非下标变量)

1、某函数定义简单变量,在本函数内处理该变量

(1) 直接访问(不用指针变量)

void f1()

{int a;

a = 5; //效率高

……

}

(2) 间接访问(用指针变量)

void f1()

{int a, *p;

p = &a;

*p = 5; //效率低

……

}

由于间接访问效率低,故一般不采用这种方法。

2、函数f1()中定义简单变量,在本函数之外(另一函数f2()中)处理该变量

(1) 值传递(不用指针变量)

void f1()

{void f2(int, int);

int a = 5, b = 3;

f2(a,b);

……

}

void f2(int x, int y)

{

printf(“sum=%d\n”, x+y);

}

如果不希望被调函数f2()改变a、b的值,只允许它使用副本,通常用这种传递——值传递。

(2) 地址传递(用指针变量)

void f1()

{void f2(int*);

int a = 5;

f2(&a);

printf(“a = %d\n”, a);

}

void f2(int *p) //注意:是在被调函数中使用指针变量

{

*p = 1;

}

这种情况下,函数f2()中使用的*p就是f1()中的a(正本),可以通过p间接访问a并且可以改变a的值。

如果希望被调函数f2()改变a的值,只能用这种传递——地址传递。

二、处理下标变量

1、函数f1()中定义数组,在本函数中访问下标变量

(1)直接访问(不用指针变量)

void f1()

{int a[10] = {3,1,5,8,7,9,6,2,0,4}, i;

for(i = 0; i <= 9; i++)

printf(“%3d”, a[i]); //用数组名访问——直接访问

printf(“\n”);

}

(2)间接访问(用指针变量)

void f1()

{int a[10] = {3,1,5,8,7,9,6,2,0,4}, i;

int *p;

for(p = a; i <= a + 9; p++)

printf(“%3d”, *p); //用指针变量访问——间接访问

printf(“\n”);

}

这种方法比用数组名访问更高效,故也经常采用这种方法。

注意:

只有访问数组中多个连续的下标变量时,才用这种间接的方法,因为它高效。若只访问其中一个下标变量,则用间接访问比直接访问要慢。如:

直接访问:

a[5] = 1; //效率高

间接访问:

p = a;

*(p+5) = 1; //效率低

2、函数f1()中定义数组,在本函数之外(另一函数f2()中)访问下标变量

(1) 值传递(不用指针变量)

f2()函数需要用几个数据,则f1()就应该传递几个数据,若所有数据都用,则需要传递所有数据。

void f1()

{void f2(int,int,……int); //共10个虚参

int a[10] = {3,1,5,8,7,9,6,2,0,4}

f2(a[0],a[1],a[2],…… a[9]); //共10个实参

}

void f2(int a,int b,int c,int d,……int j) //共10个虚参

{int sum;

sum = a + b + c + d + e + f + g + h + i + j;

printf(“sum = %d\n”, sum);

}

显然,这不是个好办法,因为这种设计使函数需要传递的参数太多,太麻烦。

所以,尽管这种值传递可以有效保护f1()中数组的数据,但仍然不被程序员所采用。

(2)地址传递(用指针变量)

void f1()

{void f2(int*);

int a[10] = {3,1,5,8,7,9,6,2,0,4}

f2(a); //数组名a作参数,而不是a[10],更不是int a[10]

}

void f2(int *p) //注意:是在被调函数中使用指针变量

{int *p0 = p, sum = 0;

for( ; p <= p0 + 9; p++)

sum += *p;

printf(“sum = %d\n”, sum);

}

只需要传递一个参数就可以了(因为数组中的下标变量是连续的,得到一个变量的地址,便可以访问到每一个变量)。

使用这种地址传递,f2()不仅可以使用数组a中的数据(如本例),还可以改变它们。其实有时候我们本来就希望被调函数f2()来改变数组中的数据(如:对数组清0,对数组排序等),此时必须采用这种传递。

下面是对数组排序的例子:

void f1()

{void f2(int*);

int a[10] = {3,1,5,8,7,9,6,2,0,4}

f2(a); //数组名a作参数,而不是a[10]

……//输出排序后的数组

}

void f2(int *p)

{int i,j,k,t;

for(i = 0; i < 9; i++)

{k = i;

for(j = i + 1; j <= 9; j++)

if(p[j] > p[k]) //p[j]等价于*(p+j)

k = j;

t = p[i];

p[i] = p[k];

p[k] = t;

}

}

相关文档
最新文档