指针(pointer)是C语言中最重要的概念之一,用于储存变量的地址。
1.&运算符
(1)一元&运算符可给出变量的存储地址。如过pooh是变量名,那么&pooh是变量地址。
(2)如下例所示,使用运算符查看不同函数中的同名变量储存在什么位置。
源代码:
//查看变量被储存在何处
#include <stdio.h>
void mikado(int); //函数原型
int main(void)
{
int pooh = 2, bah = 5; //main()的局部变量
printf("In main(), pooh = %d and &pooh = %p\n", pooh, &pooh);
printf("In main(), bah = %d and &bah = %p\n", bah, &bah);
mikado(pooh);
return 0;
}
void mikado(int bah) //定义函数
{
int pooh = 10;
printf("Int mikado(),pooh = %d and &pooh = %p\n", pooh, &pooh);
printf("In mikado(), bah = %d and &bah = %p\n", bah, &bah);
}
(3)运行结果:
可以看出,两个pooh和bah的地址不同,在计算机中,它们是四个独立的变量,具有不同的地址。
2.指针简介
从根本上说,指针是一个值为内存地址的变量。如int类型的变量的值是整数,指针变量的值是地址。
假设一个指针变量名是ptr,那么可以编写如下语句:
ptr = &pooh; //吧pooh的地址赋给ptr
对于这条语句,我们说ptr“指向”pooh。ptr和&pooh的区别是ptr是变量,而&pooh是常量。
(1)间接运算符:*
假设ptr指向bah,使用间接运算符(indirection operator)找出储存在bah中的值。
ptr = &bah;
val = *ptr; //找出ptr指向的值
相当于
val = bah;
(2)声明指针
声明指针变量必须指定指针所指向变量的类型,因为不同的变量类型占用不同的存储空间。此外,程序必须知道储存在指定地址上的数据类型。例如:
类型说明符表明了指针所指向对象的类型,型号()表明声明的变量是一个指针。intpi;声明的意思是pi是一个指针,pi是int类型。
(3)使用指针在函数间通信
交换两个变量的值。
源代码:
//使用指针解决交换函数的问题
#include <stdio.h>
void interchange(int * u, int * v);
int main(void)
{
int x = 5, y = 10;
printf("Oringinally x = %d and y = %d.\n", x, y);
interchange(&x, &y); //把地址发送给函数
printf("Now x = %d and y = %d.\n", x, y);
return 0;
}
void interchange(int * u, int * v)
{
int temp;
temp = *u; //temp获得u所指对象的值
*u = *v;
*v = temp;
}
其中,interchange(&x, &y)传递的是x和y的地址。
运行结果:
参考文献:C Primer Plus