江湖传言:得指针者得C语言。不知道这句话是从什么时候开始流传的,不过这也不重要,重要的是我们隐约能从中感受到指针在C语言中的重要性。对于初学C语言的人来说,指针可能是大多数人心中的痛。笔者当年学C语言的时候在指针这块还算顺利,自以为已经熟练掌握了指针,等到后来学习数据结构的时候,才发现自己其实一直都理解偏了,那叫一个尴尬,所以至今我都不敢说自己学会了指针,就像大多数人都不敢说自己精通了C语言一样。本文试图用较为浅显易懂的方式来重新认识指针。
先来看一个简单的例子:
#include <stdio.h>
#include <stdlib.h>
void swap(int a, int b)
{
int temp;
printf("@@2 a = %d, b = %d\n", a, b);
temp = a;
a = b;
b = temp;
printf("@@3 a = %d, b = %d\n", a, b);
}
int main(void) {
int a = 1;
int b = 3;
printf("@1 a = %d, b = %d\n", a, b);
swap(a, b);
printf("@4 a = %d, b = %d\n", a, b);
system("pause");
}
运行结果如下:
从程序的运行结果可以看到,在swap函数中明明完成了对a,b两个变量的交换,可回到主函数后a,b还是原来那个a,b,主函数对swap函数的所作所为竟毫无反应,莫非电脑进了水?其实不然,来几条打印语句看看发生了什么。
#include <stdio.h>
#include <stdlib.h>
void swap(int a, int b)
{
int temp;
printf("\n @@2 the address of a is: %p\n", &a);
printf(" @@2 the address of b is: %p\n", &b);
printf(" @@2 a = %d, b = %d\n", a, b);
temp = a;
a = b;
b = temp;
printf("\n @@3 the address of a is: %p\n", &a);
printf(" @@3 the address of b is: %p\n", &b);
printf(" @@3 a = %d, b