发布日期:2015-12-22 13:25 来源: 标签: 编程语言 C++教程 C++指针 C++指针类型
指针是C/C++编程中的重要概念之一,也是最容易产生困惑并导致程序出错的问题之一。利用指针编程可以表示各种数据结构,通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯;指针能够灵活的操作内存,合理的操作内存能够使程序更高效。
      指针是C/C++编程中的重要概念之一,也是最容易产生困惑并导致程序出错的问题之一。利用指针编程可以表示各种数据结构,通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯;指针能够灵活的操作内存,合理的操作内存能够使程序更高效。
1.指针的概念 
本质上讲指针也是一种变量,普通的变量包含的是实际的数据,而指针变量包含的是内存中的一块地址,这块地址指向某个变量或者函数,指针就是地址。指针是一个指示器,它告诉程序在内存的哪块区域可以找到数据。
2.指针的内容 
指针的内容包含4部分:指针的类型,指针所指向的类型,指针的值,指针本身所占有的内存区。在初学指针时,指针的类型和指针所指向的类型是极容易搞混淆的,弄清楚这些概念,有助于我们正确的使用指针。
3.指针的类型和指针所指向的类型 
从语法上讲,指针的类型是指把指针声明语句中的指针名字去掉所剩下的部分。 
指针指向的是一块内存区域,指针所指向的类型取决于这块内存在编译时是什么类型,比如一个int*类型指针所指向的类型是int。 
下面我来就一些例子来对这两个概念进行说明。
    int p;//这仅仅是一个普通的变量
    int* p;//int*也表示一种数据类型:int指针类型。所以p的类型为:int*类型,p所指向的类型为int型
如何看待指针类型和指针所指向的类型的方法。就上面这个int*p例子来说,它可以写成int* p,也可以写成int *p。第一种的理解偏向于地址,就是p是一个地址变量,p表示一个十六进制地址;第二种的写法偏向于值,*p是一个整型变量,它能够表示一个整型值。 这两种写法都正确,只是理解上不同,在理解指针类型和指针所指向的类型这两个概念时,完全可以把它们两个结合起来。 
想想我们使用指针的步骤:声明指针,为指针赋值,然后使用指针所指向的值。 
我们都知道指针是一种复合数据类型,它必须和基本的类型结合才能构成指针类型。 
那么int*就是一种复合的数据类型——整型指针类型。 
这样就好解释第一种写法了,在声明时,int* p,直接声明p变量为整型指针类型,这是第一步。 
第二步就是为指针赋值了,p是指针类型,它存放的是地址,这里假设我这样为它赋值:p = &普通变量;(比如int a = 5;p=&a;)。 
第三步使用指针,在C++ Primer中详细的解释了*是解除引用的运算符(我的理解是地址解析运算符),如果p是地址,那么*p就是实际的值(比如上面对应的*p = 5)。对于初学者来说,在理解它的含义时,完全可以跨过这一步,上面说了在声明指针时int* p和int *p这两种写法都可以,在声明时我偏向第一种理解,在使用时我偏向第二种理解:毕竟我们使用的是值,而*p就是这个值。 
结论:对于int* p和int *p的理解(也是对于指针类型和指针所指向的类型的理解),一个指针包含两部分,地址和值,指针声明时声明的是一个地址变量(指针就是地址),在使用时使用的是指针所指向的值。或者说指针包含两个类型:指针类型和指针所指向的类型,声明时是声明指针类型,使用时是使用指针所指向的类型。
    int p[3];//p先和[]结合,说明p是一个数组,再和int结合,所以p是一个int型数组
    int* p[3];//优先级[]比*高,p是数组,再加上int*,可以称它为指针数组,数组的每一个元素的值都为指针(地址)
    int (*p)[3];//*p可以看作是普通变量,就回到第三种情况(int p[3]),但是这里p是指针变量,它指向的是一个包含3个整型数值的数组。可以称它为数组指针,数组中每一个元素的值为普通整型值。
    int** p;//int*代表指针类型,*是指针类型,所以p是指向int型指针的指针,p指向的类型是int*类型(int型指针)
    int p(int);//这很明显是一个返回类型为int,并且带一个int型参数的函数
    int (*p)(int);//p是函数指针,指向的是返回值为int并且带一个int参数的函数。这个声明包含两部分:函数变量+函数地址变量(姑且把函数也看做是变量)
    int* (*p(int))[3];//这个有点复杂,它仍然是一个函数指针。从*p(int)看,它是函数指针,带一个int参数;然后看[],说明函数返回值为数组,然后返回类型为int*。所以p是一个指向返回值为int*型指针数组,并且带一个int型参数的函数的指针
在平常使用中,我们只需要理解前面几个就可以了,太复杂的指针基本用不到,可读性也不好。

相关评论

专题信息
    C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持多种编程范式 --面向对象编程、泛型编程和过程化编程。最新正式标准C++于2014年8月18日公布。 其编程领域众广,常用于系统开发,引擎开发等应用领域,是至今为止最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性! 本教程从基础讲解了C++语言,希望对大家有所帮助,望多多支持中国站长网络学院。