C语言指针的学习心得(一)

概述

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

什么是指针?

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

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

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

使用指针的好处

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

  1. 指针能够提升效率。C语言是一种偏底层的语言,为了更直接对内存进行操做,必须使用指针。由于指针是根据内存的地址来操做变量。了解过汇编语言的朋友,可能会知道汇编语言中有寻址这个操做,指针和寻址有殊途同归之妙。另外,若是须要传输大量的数据,能够经过传输起始地址和结束地址来代替(即传递指针),前提是储存的数据地址必须是连续的。code

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

如何定义指针?

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

#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:以上内容是本人学习指针内容的心得,因为指针内容确实是一个难点,若有大神发现文中内容有不足之处但愿可以提点。

相关文章
相关标签/搜索