指针是C语言最重要的概念之一,用于存储变量的地址,同C语言中其他变量一样,把指针也看成是一种变量即可。
一,查找地址:&运算符
如果主调函数不使用return返回的值,则必须通过地址才能修改主调函数中的值。
我们可以用一元&运算符和%p给出变量的存储地址
#include<stdio.h>
void mikado(int);
int main()
{
int pooh = 2, bah = 5;
printf("In mian(),pooh= %d and &pooh= %p\n", pooh, &pooh);
printf("In mian(),bah= %d and &bah= %p\n", bah, &bah);
mikado(pooh);
return 0;
}
void mikado(int bah)
{
int pooh = 0;
printf("In mian(),pooh= %d and &pooh= %p\n", pooh, &pooh);
printf("In mian(),bah= %d and &bah= %p\n", bah, &bah);
}
结果
该例说明了两个函数中的同名变量的地址和值不相同,计算机把两个pooh和两个bah看作四个独立的变量;其次,函数调用的时候传递的是值。涉及的两个变量并未改变。原因是:C程序在调用函数时使用“按值调用”,这意味着变量的值直接从调用函数复制到被调函数的实参中,“按值调用”是C语言中调用函数的唯一方式。
一个例子
假设我们需要一个交换两个变量的函数
void swap(int x, int y)
{
int tmp = x;
x = y;
y = tmp;
}
void change()
{
int a = 100;
int b = 200;
swap(a, b);
}
运行会发现两个变量的值并未交换。前面提到过,函数只可以传递值,我们的确可以返回一个指定的值,但是return语句只能把被调函数的一个值传回主调函数,但我们需要传回两个函数,C语言的函数可以做到这一点,但是需要使用指针;
二,间接运算符*(指针声明)
指针也是一种变量类型,只是声明指针变量的形式稍微复杂一点,以指向int为例
int cat,dog=250;
1.创建指针变量:基本类型+*—— int* ptr;
2.给指针变量赋值:&+变量—— ptr =&dog; //把dog的地址赋给指针变量,这里用到&运算符,对于这条语句,我们说ptr指向dog,这里的ptr是一个可修改的左值,而&dog是一个常量;
3.找出指针变量保存的地址中值:*+指针变量——cat=*ptr; //不要把间接运算符和二元乘法运算符混淆,虽然它们使用的符号相同,但语法功能不同;
以上语句 ptr=&dog; 和 cat=*ptr;放在一起相当于cat=dog; 由此可见,是用地址和间接运算符可以间接完成上面这条语句的功能。
小结:指针相关运算符
地址运算符&:后跟一个变量名时,&给出该变量的地址。
间接(解引用)运算符*:后跟一个指针名或地址时,*给出存储在指针指向地址上的值;
回到那个例子
我们刚刚接触指针,并可以利用指针解决函数间的通信问题,将交换变量的函数进行修改
void swap(int* x, int* y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
void change()
{
int a = 100;
int b = 200;
swap(&a, &b);
}
普通变量把值作为基本量,把地址作为通过&运算符获得的派生量,而指针变量把地址作为基本量,把值作为通过*运算符获得的派生量。
虽然打印地址可以满足好奇心,但这不是&运算符的主要用途,更重要的时使用&,*,和指针可以操纵地址和地址上的内容。