首先我们要记住的是:指针变量只能存放地址(指针),不要将一个整数(或者任何其它非地址类型的数据)赋给一个指针变量。比如:这里是不合法的: pointer_1 = 10; / pointer_1是指针变量,10为整数*/
变量的指针就是变量的地址。存放变量地址的变量是指针变量,它用来指向另一个变量的。程序中的“*”就是指向的意思。比如:如果我们知道pointer_1是一个指针变量,则:
(* pointer_1)就是pointer_1所指向的变量。
定义指针变量的一般形式是:
基类型 * 指针变量名;
基类型可以为int ,float等。它用来指定该指针变量可以指向的变量的类型。比如:
int * pointer_1中基类型int 的指针变量pointer_1只能用来指向整数的变量。而不能指向浮点变量。
定义指针变量时要注意两点:
1、指针变量前面的“*”表示该变量的类型为指针型变量。指针变量名为pointer_1 ,而不是 * pointer_1,这是与定义整型浮点型的形式是不同的。
2、定义指针变量时必须指定基类型。因为不同类型的数据在内存中所占的字节数是不同的。比如:整型占两个字节,字符型数据占一个字节。在指针的移动和指针的运算中,比如:“使指针移动一个位置”或者“使指针值加<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1”这个一代表什么?如果指针指向一个整型变量,那么“使指针移动一个位置”就是移动两个字节,“使指针值加1”就是地址加两个字节。如果这个指针是浮点型的,那么就是四个字节了。所以必须指定基类型。
下面对“&”和“*”再说明一些要点:如果已经执行了语句:pointer_1 = &a;
1、那么&* pointer_1的含义是什么?我们知道,“&”和“*”两个运算符的优先级别相同,而且是从右到左的方向结合。所以先进行* pointer_1运算,那么它就是变量a,再执行&运算,我们知道,它的意义是取地址,那么&* pointer_1与&a相同,即变量a的地址。2、那么*&a的含义是什么呢?我们知道先进行&a运算,得到a的地址,再进行*运算,即&a所指向的变量,也就是变量a,*&a和* pointer_1的作用是一样的。都等价于变量a。3、 (* pointer_1)++相当于a++。注意,这个括号是必须要加的,如果没有括号的话,那么就成为了* pointer_1++,因为++和*同一优先级别,结合方向从右向左,因此它相当于了: *(pointer_1++)。由于++在pointer_1右边,是后加。因此先对pointer_1的原值进行*运算,再使pointer_1的值改变,这样的话pointer_1不再指向a了。
另外,我们看一个例子:我们需要对输入的两个整数按大小顺序输出:
#include
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
void main()
{
void swap(int * p1,int * p2);
int a,b;
int * pointer_1,* pointer_2;
scanf("%d,%d",&a,&b);
pointer_1 = &a;
pointer_2 = &b;
if( a
printf("\n%d,%d\n",* pointer_1,* pointer_2);
getch();
}
void swap( int * p1,int * p2)
{
int p;
p = p1;
p1 = p2;
p2 = p;
}
这个程序能不能成功呢?可能作者的设想是:先使pointer_1指向a,pointer_2指向b;再调用swap函数,将pointer_1的值传给p1, pointer_2的值传给p2;再在swap函数中使p1和p2的值交换;最后形参p1和p2将地址传回实参pointer_1和pointer_2。如果输入2和3,那么预想的输出是“3、2”但是事实上不可能的。输出仍然是“2、3”。
因为C语言中实参变量和形参变量之间的数据传递是单向的“值传递”的方式。指针变量作函数参数也要遵循这一规则 。不可能通过调用函数来改变实参指针的值,但是可以改变实参指针变量所指变量的值。而函数的调用可以也只可以得到一个返回值,而运用指针变量作参数,可以得到多个变化了的值,如果不用指针的话是难以做到这一点的。
所以我们应该将swap函数改成这样即可:
void swap( int * p1,int * p2)
{
int p;
p = *p1;
*p1 = *p2;
*p2 = p;
}
总结:如果想通过函数调用得到n个要改变的值,可以这样:
1、 在主调函数中设n个变量,用n个指针变量指向它们;
2、 然后将指针变量作为实参,将这n个变量的地址传给所调用的函数形参;
3、 通过形参指针变量,改变该n个变量的值;
4、 主调函数中就可以使用这些改变了值的变量。
wqd520 2008-6-22 00:35