谈C/C++指针精髓(一)

[摘要]

指针是C和C++语言编程中最重要的概念之一,也是最容易产生困惑并导致程序出错的问题之一。利用指针编程可以表示各种数据结构, 通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯;并能像汇编语言一样处理内存地址,从而编出精练而高效的程序。指针极大地丰富了C和C++语言的功能。

在本文中,主要分两部分对指针进行讨论。首先,基础篇讨论关于指针的内容和运算操作等,可以是读者对指针的知识有一定了解和认识;随后在使用篇中重点讨论指针的各种应用,揭破指针在日常编程中的精髓,从而使读者能够真正地了解、认识和使用指针。

第一篇:基础篇

1.1指针的概念

谈到指针,它的灵活性和难控制性让许多程序员谈虎色变;但它的直接操作内存,在数据

操作方面有着速度快,节约内存等优点,又使许多C++程序员的深爱不以。那么指针究竟是怎么样一个概念呢?

其实, 指针就是一类变量,是一类包含了其他变量或函数的地址的变量。与其他变量所不同的是,一般的变量包含的是实际的真实的数据,而指针是一个指示器,它告诉程序在内存的哪块区域可以找到数据。

好了,在这里我们可以这样定义指针:指针是一类包含了其他变量或函数的地址的变量,它里面存储的数值被解释成为内存的地址。

1.2指针的内容

简单讲,指针有四个方面的内容:即指针的类型,指针所指向的类型,指针的值,指针本身所

占有的内存区。下面我们将分别阐述这些内容。

1.2.1指针的类型

从语法的角度看,指针的类型是指把指针声明语句中的指针名字去掉所剩下的部分。这是指针本身所具有的类型。例如:

int *ip;    //指针的类型是int*
char *ip;    //指针的类型是char*
int **ip;    //指针的类型是int**
int (*ip)[5];  //指针的类型是int(*)[5]

1.2.2指针所指向的类型

当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么类型来看待。从语法的角度看,指针所指向的类型是指针声明语句中的指针名字和名字左边的指针声明符*去掉所剩下的部分。例如:

int *ip;     //指针所指向的类型是int
char *ip;    //指针所指向的类型是char
int **ip;    //指针所指向的类型是int*
int (*ip)[5];  //指针所指向的类型是int()[5]

1.2.3指针的值(或称指针所指向的内存区)

指针的值或者叫指针所指向的内存区或地址,是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。 指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。

指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在上例中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。

以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里?

1.2.4 指针本身所占有的内存区

指针本身所占有的内存区是指针本身占内存的大小,这个你只要用函数sizeof(指针的

类型)测一下就知道了。在32位平台里,指针本身占据了4个字节的长度。

指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。

时间: 2024-09-29 01:06:25

谈C/C++指针精髓(一)的相关文章

谈C/C++指针精髓(三)

1.4指针的运算 1.4.1赋值运算 指针变量的赋值运算有以下几种形式: 1.4.1.1指针变量初始化赋值如下: int a: int *ip=&a: 1.4.1.2把一个变量的地址赋予指向相同数据类型的指针变量.例如: int a; int *ip; ip=&a; //把整型变量a的地址赋予整型指针变量ip 1.4.1.3把一个指针变量的值赋予指向相同类型变量的另一个指针变量.例如: int a; int *pa=&a; int *pb; pb=pa; //把a的地址赋予指针变量

谈C/C++指针精髓(二)

1.3指针与内存管理 利用指针你可以将数据写入内存中的任意位置,但是,一旦你的程序中有一个野指针("wild"pointer),即指向一个错误位置的指针,你的数据就危险了-存放在堆中的数据可能会被破坏,用来管理堆的数据结构也可能会被破坏,甚至操作系统的数据也可能会被修改,有时,上述三种破坏情况会同时发生.所以合理的正确的分配指针的地址是非常重要的. 1.3.1内存分配的方式 内存分配方式有三种: (1)从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都

浅谈JavaScript中指针和地址_javascript技巧

个人理解:指针只是指向内存的一个索引:而地址则是内存中确切的位置. 下面是函数中关于指针和地址一个小例子: function sum(num1,num2){ return num1+num2; } alert(sum(10,10)); //20 var anotherSum=sum; alert(anotherSum(10,10)); //20 sum=null; alert(anotherSum(10,10)); //20  注意:使用不带圆括号的函数的名是访问函数指针,而非调用函数,所以 s

C++指针专题

C++中指针的引用详解 C++中智能指针(smarter pointer)自定义删除器(deleter) 的方法 C++:派生类强制转换为基类 C++二维指针动态分配内存连续问题 C++中的值传递,引用传递及指针传递 C++常量指针和指针常量 C++指针和数组 C++必知必会(五) 引用是别名而非指针 谈函数指针(全局/类成员函数)和函数对象 构造函数中的this指针 Google C++编程风格指南(四):智能指针和其他C++特性 声明函数指针并实现回调 C++指针使用方法解惑 浅析C++中的

跟你的网站谈恋爱

我想起以前陈安之写过一本<跟你的产品谈恋爱>,具体内容倒是一点都想不起来了.只记得了这个标题.觉得很有意思.搞网络久了,突然对这个标题产生了感触,于是想,其实跟网站也可以谈恋爱的. 很多时候,感觉运营网站的确跟谈恋爱非常的类似.如果谈恋爱的一些精髓借鉴过来,对运营网站很有指导意义. 白天,在线上问一个MM最近的感情进展.得知她最近已经有了男朋友,终于告别了她那爱玩的岁月.我很奇怪特别爱玩的她,怎么被GG给纳入怀中了.因为我看到很多不错的男同胞都在追她,她一直不肯就范.她向我透露了最核心的两点:

如何区分C/C++常量指针和指针常量

C++中的常量指针和指针常量是很容易混乱.其实本来没什么,这无非是const int *p与int* const p的区别, 但一涉及到起名字,特别是给他们戴上"常量指针"和"指针常量"的中文帽子,由于作者和译者(针对外文书)的不同,就出现了"张冠李戴"和"李冠张戴"的乱像,不知道谁是谁了,弄得人一头雾水,尤其是对于初学者.本文的目的就是针对这一细节,为大家将两者理清楚,同时说明在使用上的区别. 注意:1.const int

014_《Delphi高手突破》

<Delphi高手突破> Delphi 教程 系列书籍 (014) <Delphi高手突破> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Pdf 附书源码   作者: 申旻 丛书名: 其他 出版社:清华大学出版社 ISBN:7900643575 上架时间:2002-11-2 出版日期:2002 年10月 开本:16开 页码:301 版次:1-1 内容简介 这本书以理论结合实践的方式,论述"如何在Delphi中使用面向对象编程方法,构建良好设计

周黑鸭再诉《变4》:借势营销,做一只娱乐的鸭子

一部<变形金刚4>(简称"<变4>")究竟能为来自中国的广告主带来多大的品牌收益?答案或许远远不止在片中的几秒露脸那么简单. 7月16日,据人民网报道称,知名食品连锁品牌周黑鸭因不满植入效果而向<变4>发出声讨,目前周黑鸭的律师函已经抵达<变4>中国合作方瑞格传播公司的桌面上. 周黑鸭副总裁郝立晓表示:"关键是有没有将双方约定执行到位,我们依法上诉争取合法权益." 在集合了众多中国品牌的<变4>中,周黑鸭的

《变4》再遭周黑鸭上诉

本报记者 张汉澍 上海报道 一部<变形金刚4>(简称"<变4>")究竟能为来自中国的广告主带来多大的品牌收益?答案或许远远不止在片中的几秒露脸那么简单. 7月16日,据人民网报道称,知名食品连锁品牌周黑鸭因不满植入效果而向<变4>发出声讨,目前周黑鸭的律师函已经抵达<变4>中国合作方瑞格传播公司的桌面上. 周黑鸭副总裁郝立晓表示:"关键是有没有将双方约定执行到位,我们依法上诉争取合法权益." 在集合了众多中国品牌的&l