指针变量的使用场合及常见的使用方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
}
}