指针的一些基础的东东

来源:互联网 发布:细说php视频教程 编辑:程序博客网 时间:2024/05/01 01:39

    指针,其实用的熟透的话,是个非常好的东东;因此,初来乍到的人,看到强盗、无敌而又可爱的她是那么的束手无策,像是什么看到了刺猬而无从下口,让人肝%@#寸*&^~的,不知然多少人抓乱了头发,掉了多少头发,心里暗暗发誓,俺就不信你的鞋,就要把你搞定不可,然后就咔咔咔……

    嗯,不错,其实,指针就这样,咋样呢?

    我们也要区分内存单元地址和内存单元内容。

    我们在程序中定义的不管是何种类型的变量,表面上都是通过对应类型的变量名来对内存单元进行存取操作的;但是,深层次的,程序在经过编译系统编译后,已经将变量名转换为变量的地址(即变量名是与其地址相对应),因此,对变量值的存取,都是通过其对应的地址进行的。此即为:直接存取或直接访问。

    因此,利用 & -》 取地址运算符,可以取得变量的地址,储存在对应的指针变量中,然后通过指针变量间接访问所指向的变量。所谓指向,是通过地址来体现的,用 "->" 来表示这种指向关系。

    指针变量是专门用来存放另一变量 - - -(无论是内置类型还是自定义类型)的地址 - - -(即:我们该明了,变量的地址即为该变量的指针,变量的指针就是变量的地址。说白了就是指针即地址,地址即指针。);- - - 所以说指针变量是区别于指针的。

    基类型* 指针变量名 (基类型* 也可说是地址类型,指针类型),注意哦:在变量名前面的"*" 表示该变量是指针变量,它不是指针变量的一部分。因为指针变量是用来存放变量地址的,因此对她赋值或初始化的时候要小心了!!!

    指针作为函数参数,她的作用是将一个变量的地址传给被调用函数的形参。

    要知道怎么解析含有 & (取地址运算符) 和 *(解引用操作符)的表达式???

    指针与数组

    指向数组元素的指针

    数组元素的指针即为数组元素的地址;因此,可以定义指针指向数组元素;我们应该明白一点:数组名是数组首元素的地址,定义且编译后其值相当于是一个常量 - - - (有的直接说就是常量,但是数组名它却不占用内存空间,而常量他是要占用存储空间的);因此,不能对数组名进行赋值,也不能对它进行自增、自减这种运算,但是可以参与其它的一些运算。

    我们经常碰到这种情况:指针变量 pointer 指向一个数组,且pointer等于数组名(即是将数组首元素地址赋给pointer),若有此:pointer+i - - -> 解析:pointer是地址,加的可不是i(偏移量),而是数组元素在内存中所占的字节数,即pointer + i*d (d = sizeof(类型))。

    对于数组中的任意元素 eg:arr[i] ,实际上在编译系统编译时,对arr[i]是按照 *(arr+i) 来处理的,即:数组首元素的地址加上相对偏移量(或说是位移量),得到要找的数组元素的地址,然后用解引用操作符得到单元中的内容。

    几种等价的形式:arr[i] <=> *(arr+i) <=> pointer[i] <=> *(pointer+i)

    怎么解析:*pointer++ 与 *++pointer ??? 

    还有:*pointer-- 与 *--pointer ???(很多人都会犯糊涂的滴哦!!! 好像谭老师的解释也不对哦!!!)

    访问数组中数组元素可用:下标法(直观)、指针法(占用内存少,运行速度快)、地址法、指针变量

    用指针变量做函数参数接收数组地址

    C++编译系统将形参数组名一律当作指针变量来处理

    比如:

      void func(int array[],int n)

      void func(int* array,int n)

    上面两种方式是等价的;(可以用sizeof()来检验他们在内存中占用的存储空间,同时与主函数中相比,会得到结果滴!)

    因为在调用函数的时,系统会建立一个指针变量array,用来存放从主调函数传递过来的实参数组首元素的地址。

    实际上在函数调用时并不存在一个占有存储空间的形参数组,只有指针变量。但是可以讲形参数组看做从实参数组那里得到其起始地址,并与其共用一段内存空间。

    注意:形参数组名是指针变量,因此其值可以改变的(⊙o⊙)…

    区分const T* p 、T const * p 与 T* const p

    const T* p 与 T const * p 的意思完全一样,禁止该指针变量修改其所指向的变量的内容,只能查看,即使指向的内容可以修改(其它途径)

    T* const p 指针p是只读的,因为其前有const限制,且必须进行初始化,而不能对其赋值,但可对其所指向的内容进行修改。

    数组、函数与指针

    T* p[n] - -> p是一个数组,有n个元素,每个元素是指向T的指针变量,(这即是指针数组,有n个指向T型的指针变量组成)

    T(*p)[n] - -> p是一个指针,指向由n个元素组成的T数组,(p为指向含有n个元素的一维数组的指针变量)

    T* p( ) - -> p是一个函数,返回值的类型为T*,(p为带回一个指针的函数,该指针指向T型)

    T(*p)( ) - -> p为一个指针,指向的是一个返回值T型的函数,(p为指向函数的指针,该函数返回一个T型数据)

    T** p - -> p为一个二级指针变量,指向的是一个指向T型变量的指针变量

原创粉丝点击