指针的一些基础的东东
来源:互联网 发布:细说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型变量的指针变量
- 指针的一些基础的东东
- 自己的一些基础东东
- c++的指针的一些小东东
- 智能指针的东东
- 一些 汇编 的 东东
- DropDownList的一些东东
- 一些oracle的东东
- vlan的一些东东
- IOS的一些东东~
- 一些开源的东东
- Solaris10的一些新东东
- 一些非常好的DBA东东
- 关于IPC$的一些东东
- 关于WPF的一些东东
- 截取字符串的一些东东
- 单例的一些东东
- 关于一些内存的东东
- 关于Latex的一些东东
- 字符串的排列组合问题
- shared_ptr enable_shared_from_this - C++11, 3 of n
- android的多线程详解
- 已知二叉树先序和中序遍历,生成二叉树
- 【js与jquery】导航下拉菜单效果
- 指针的一些基础的东东
- windows7 NAT方法 虚拟机上网 和 crt连接
- NFS安装
- 8月5日到9月2日工作总结
- RTTI(dynamic_cast与typeid)
- PADS中Layer的描述说明
- IIS 安装配置全攻略——WEB篇
- Android开发中的多线程编程技术
- dede 面包屑最后一个>