6

概述

指针在C语言中具有十分高的地位。掌握指针的使用方法是一个C语言程序员应该具有的基础技能。总之,指针十分重要。很多初学者对于这一部分的知识表示很难理解,由此可见指针是C语言学习的一个难点。本文尝试用类比和举例的方法帮助各位初学者朋友理解指针。

什么是指针?

以下这段话源自谭浩强的《C语言程序设计》,给出了指针的具体定义。

对每一个变量,它在内存中都有一个存储位置,这个位置就是该变量的地址,对变量值的存取是通过地址进行。在C语言中这个地址被形象化地称为“指针”。

由上面的这段话可以得知,指针的本质其实是地址,指针变量就是存放另一变量的地址。我们可以利用指针直接对内存进行操作,利用存放变量的地址找到变量。举一个贴近生活的例子,把一个地区比作内存,房子比作指针,居民比作变量。我们要在内存找一个变量,可以根据指针。就如在一个地区要找一个人,我们可以通过寻找这个人的住址把这个人造出来。一般来说,地址是不会轻易改变的。如果我们需要指定某些特定的内存地址存储的变量进行某些操作,都会利用到指针。这就好比A住在房子甲,街道需要房子甲的住户打扫门前卫生,这时可以通过地址找到A打扫卫生。如果A在某天搬到房子乙,而B住进了房子甲。打扫房子甲门前卫生的就是B,打扫房子乙门前卫生的就是A。

使用指针的好处

说到指针的好处,网上很多的大神也提过。由于本人实践的经验不多,一些未验证过的观点在此就不作太多介绍。只对一下两点作出解释。

  1. 指针可以提高效率。C语言是一种偏底层的语言,为了更直接对内存进行操作,必须使用指针。因为指针是根据内存的地址来操作变量。了解过汇编语言的朋友,可能会知道汇编语言中有寻址这个操作,指针和寻址有异曲同工之妙。另外,如果需要传输大量的数据,可以通过传输起始地址和结束地址来代替(即传递指针),前提是储存的数据地址必须是连续的。

  2. 提高灵活度。了解过数据结构的朋友都知道链式储存结构。尽管数据的储存单位不是连续的,但并不影响这些数据的逻辑关系。指针就是实现链式储存结构的桥梁,通过指针把这些分散在内存不同地方的数据联系起来。

如何定义指针?

以下实例定义了一个整形数值i和整形指针变量p,通过 p来得到i的值。其中 "*" 不是乘号,而是指针变量的标志,在变量前加上它,说明变量是指针变量。"&"是取地址符号,在某个变量前加上它,可以获得这个变量的地址。

#include <stdio.h>

int main()
{
    int i,*p;//定义整形变量i和整形指针变量*p
    i = 6;//赋值
    p = &i;//p指向i的地址
    printf("the value of i is %d\n",i);//i的值
    printf("the value of &i is %d\n",&i);//i的地址的值
    printf("the value of p is %d\n",p);//p指向地址的值    
    printf("the value of *p is %d\n",*p);//通过p指向的地址找到的值

  return 0;
}


运行结果:i的值是6,地址是1638212。p指向的地址也是1638212。


the value of i is 6
the value of &i is 1638212
the value of p is 1638212
the value of *p is 6

接下来我们看一下更加有趣的例子

#include <stdio.h>

int main()
{
    int i,*p;//定义整形变量i和整形指针变量*p
    i = 6;//赋值
    p = &i;//p指向i的地址
    printf("the value of i is %d\n",i);//i的值    
    printf("the value of *(&i) is %d\n",*(&i));//指向i地址指针的值
    printf("the value of &i is %d\n",&i);//i的地址的值
    printf("the value of &(*p) is %d\n",&(*p));//p指针指向的值的地址

  return 0;
}

运行结果:

the value of i is 6
the value of *(&i) is 6
the value of &i is 1638212
the value of &(*p) is 1638212

虽然这两个实例看起来好像,但是通过第二个实例可以总结出一个很有用的结论:一般来说,我们可以把*p看成一个变量,这个变量指向谁就等价于谁。
如:&i的值和&(*p)的值是相同的,说明i和指针*p是等价的。

实例

#include <stdio.h>

int main()
{
    int a,b,*p,*q;//定义整形变量a,b和整形指针变量*p,*q
    a = 1;//a赋值
    b = 9;//b赋值
    p = &a;//p指向a的地址
    q = &b;//q指向b的地址
    printf("before exchange: a is %d,b is %d\n",*p,*q);
    p = &b;//p指向b的地址
    q = &a;//q指向a的地址
    printf("after exchange: a is %d,b is %d\n",*p,*q);
  return 0;
}

运行结果:

before exchange: a is 1,b is 9
after exchange: a is 9, b is 1

以上实例利用指针实现两个变量数值的交换。指针p本来是指向a的地址,交换后指针p指向b的地址,所以通过指针p找到的值就是b。同理可知指针q交换后指向a的地址。
再举一个例子帮助理解,如果把a和b比作两个人,p和q比作身份证,交换a和b的值比作交换身份。原本通过身份证p找到的人是a,通过身份证q找到的人是b。现在两人交换身份,身份证p照片改成是b的,身份证q照片改成a的。通过身份证p找到的人当然是b,通过q找到的人就是a了。

总结

以上介绍了C语言指针的基础内容,包括指针概念、定义指针的方法和指针的简单使用实例。更多的内容会在日后的文章中提到。
ps:以上内容是本人学习指针内容的心得,由于指针内容确实是一个难点,如有大神发现文中内容有不足之处希望能够提点。


nothingCheung
11 声望3 粉丝