第1章 间接访问—指针.ppt
《第1章 间接访问—指针.ppt》由会员分享,可在线阅读,更多相关《第1章 间接访问—指针.ppt(109页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、第7章 间接访问指针,指针的概念指针运算与数组动态内存分配字符串再讨论指针作为函数参数和返回值指针数组与多级指针指向多维数组的指针指向函数的指针,指针介绍,本章将介绍C+语言的一个重要的特性:指针,为了成为一个优秀的C+语言程序员,你必须掌握指针并熟练地使用它们。,指针是内存的地址并可作为数据是一个灵活和危险的机制允许共享处理数据允许内存动态分配(只要需要,而非预先定义),指针的概念,指针就是把地址作为数据处理指针变量:存储地址的变量变量的指针:当一个变量存储另一个变量的地址时,那我们说它就是那个变量的指针使用指针的目的:提供间接访问,指针的概念 续,如在某一程序中定义了 int x = 2;
2、如系统给x分配的空间是1000号单元,则指向x的指针是另一个变量p,p中存放的数据为10001000号单元的内容有两种访问方式:访问变量x(直接访问)访问变量p指向的单元的内容(间接访问),定义指针变量,定义指针变量要告诉编译器该变量中存放的是一个地址。指针变量的主要用途是提供间接访问,因此也需要知道指针指向的单元的数据类型指针变量的定义 类型标识符 *指针变量; 如:int *intp; double *doublep; int *p, x, *q;,指针变量的操作,如何让指针指向某一变量?因为我们不知道系统分配给变量的真正地址是什么。用地址运算符 “& 运算符后面不能跟常量或表达式。如 &
3、2 是没有意义的,&(m * n + p )。也是没有意义的如何通过指针变量处理和改变它所指向的单元的值?用引用运算符 “*” 解决。如 *intp 表示的是 intp 指向的这个单元的内容。如:*intp = 5 等价于 x = 5在对 intp 使用引用运算之前,必须先对 intp 赋值,指针实例,如有:int X, *intp, Y;X=3;Y=4;intp=,如执行:*intp=Y+4;,注意:不能用 intp=100;因为我们永远不知道变量存储的真实地址,而且程序每次运行变量地址可能都不同。,指针使用,指针变量可以指向不同的变量。如上例中intp指向x,我们可以通过对intp的重新赋
4、值改变指针的指向。如果想让intp指向y,只要执行intp=&y就可以了。这时,intp与x无任何关系。同类的指针变量之间可相互赋值,表示二个指针指向同一内存空间。空指针指针没有指向任何空间空指针用常量NULL表示,NULL的值一般赋为0不能引用空指针指向的值,指针变量的使用,设有定义 int x, y; int *p1,*p2;,执行语句:x=23;y=234;,执行语句:p1=,执行语句:*p1=34;p2=p1;,指针实例,有以下结构,比较执行 p1=p2和 *p1= *p2后的不同结果。,指针的初始化,指针在使用前必须初始化。和别的变量一样,定义指针不初始化是一个比较普通的错误。没有初
5、始化的指针可能指向任意地址,对这些指针作操作可能会导致程序错误。NULL是一个特殊指针值,称为空指针。它的值为0。它可被用来初始化一个指针,表示不指向任何地址。思考:int *p; *p = 5; 有什么问题?,第7章 间接访问指针,指针的概念指针运算与数组动态内存分配字符串再讨论指针作为函数参数和返回值指针数组与多级指针指向多维数组的指针指向函数的指针,指针运算和数组,指向数组元素的指针数组元素是一个独立的变量,因此可以有指针指向它。如:p = &a1, p = &ai数组元素的地址是通过数组首地址计算的。如数组的首地址是 1000,则第i 个元素的地址是1000 + i * 每个数组元素所
6、占的空间长度,指针与数组,在C+中,指针和数组关系密切,几乎可以互换使用数组名可以看成是常量指针,对一维数组来说,数组名是数组的起始地址,也就是第0个元素的地址如执行了p=array,则p与array是等价的,对该指针可以进行任何有关数组下标的操作,例如:有定义 int a10, *p 并且执行了 p=a, 那么可用下列语句访问数组a的元素for ( i=0; i10; +i ) cout pi;,指针运算,指针+1表示数组中指针指向元素的下一元素地址;指针-1表示数组中指针指向元素的上一元素地址;合法的指针操作:p + k, p - k, p1 - p2,指针保存的是一个地址,地址是一个整型
7、数,因此可以进行各种算术运算,但仅有加减运算是有意义的。指针运算与数组有密切的关系,数组元素的指针表示,当把数组名,如 intarray,赋给了一个同类指针intp 后,intarray 的元素可以通过intp访问。第i个元素的地址可表示为 intp + i,第i个元素的值可表示为 *(intp + i)。通过指针访问数组时,下标有效范围由程序员自己检查。如输出数组 a 的十个元素,方法3: for ( p=a; pa+10; +p ) cout *p ;,方法2: for ( i=0; i10; +i ) cout *(a+i);,方法1: for ( i=0; i10; +i ) cout
8、 ai;,方法4: for ( p=a, i=0; i10; +i ) cout *(p+i);,方法5: for ( p=a, i=0; i10; +i ) cout pi ;,下列程序段 有无问题? for ( i=0; i10; +i ) cout *a ; +a; ,指针和数组的区别,虽然通过指针可以访问数组,但两者本质是不同的。在定义数组时为数组的各个元素分配了全部的存储区,而在定义指针时,仅仅分配四个字节的存储区存放指针地址。只有把一个数组名付给了对应的指针后,指针才能当作数组使用如有:int array5, *intp;,当执行了 intp = array后,第7章 间接访问指针
9、,指针的概念指针运算与数组动态内存分配字符串再讨论指针作为函数参数和返回值指针数组与多级指针指向多维数组的指针指向函数的指针,动态分配,在C+语言中,每个程序需要用到几个变量,在写程序前就应该知道。每个数组有几个元素也必须在写程序时就决定。有时我们并不知道我们需要多大的数组元素直到程序开始运行。因此希望能在程序中根据某一个当前运行值来决定数组的大小。如设计一个打印魔阵的程序,我们希望先输入魔阵的阶数,然后根据阶数定义一个矩阵,动态分配方法,这些问题的解决方案就是内存的动态分配。我们定义一个指针,并让它指向一个合适的内存。如: int *scores; scores = 内存的起始地址;,动态内
10、存分配与回收,中由new 和 delete两个运算符替代- 运算符new用于进行内存分配: 申请动态变量:p = new type; 申请动态数组:p = new typesize; 申请动态变量并初始化:p = new type(初值); - 运算符delete 释放 new分配的内存: 释放动态变量:delete p; 释放动态数组:delete p;,动态内存分配与回收,/为简单变量动态分配内存,并作初始化int main() int *p; p = new int(99); /动态分配内存,并将99作为初始化值赋给它 cout *p; delete p; return 0;,动态内存分
11、配与回收,/动态字符串的使用int main()int *p; char *q; p = new int(5); q = new char10; strcpy(q, abcde); cout *p endl; cout q endl; delete p; delete q; return 0;,输出结果:5abcde,动态分配的检查,new操作的结果是申请到的空间的地址当系统空间用完时,new操作可能失败new操作失败时,返回空指针,动态内存分配与回收,/动态分配检查int main()int *p; p = new int; if(!p) cout allocation failuren;
12、return 1; *p = 20; cout *p; delete p; return 0;,assert宏,assert()宏在标准头文件cassert中 assert()有一个参数,表示断言为真的表达式,预处理器产生测试该断言的代码。如果断言不是真,则在发出一个错误消息后程序会终止。,#include #include /包含assert宏的头文件using namespace std;int main() int *p; p = new int; assert (p != 0); /p等于0,则退出程序 *p=20; cout n; if (!(p = new int n) exit(
13、1); for (i=0; i pi; for(i=0; in; +i) sum += pi; delete p;cout Number of elements: n endl; cout Sum of the elements: sum endl; return 0;,可改为:p = new int n;assert( p != NULL);,第7章 间接访问指针,指针的概念指针运算与数组动态内存分配字符串再讨论指针作为函数参数和返回值指针数组与多级指针指向多维数组的指针指向函数的指针,字符串再讨论,字符串的另一种表示是定义一个指向字符的指针。然后直接将一个字符串常量或字符串变量赋给它 如
14、char *String, ss =“abcdef”; String = “abcde”; String = ss;,String = “abcde”;的执行结果,字符串常量存储在一个称为数据段的内存区域里 将存储字符串”abcde”的内存的首地址赋给指针变量String。,String = ss的执行过程,将字符数组ss的起始地址存入String,String = new char5;strcpy(String, “aaa”),动态变量存储在堆工作区 将存储字符串”aaa”的内存的首地址赋给指针变量String。,用指针表示的字符串的操作,可以直接作为字符串操作函数的参数。但必须注意,如果该
15、指针指向的是一个字符串常量时,则使用是受限的。如不能作为strcpy的第一个参数由于在C+中,数组名被解释成指向数组首地址的指针。因此,字符串是用一个指针变量表示,我们可以把此指针变量解释成数组的首地址,通过下标访问字符串中的字符。如string3的值是d。,用指针处理串,目的:编写一个记录串中单词的个数的函数。关键技术:要传递一个字符串给函数,字符串作为函数的参数,字符串作为函数的参数和数组名作为参数传递一样,可以有两种方法作为字符数组传递作为指向字符的指针传递两种传递方式的本质是一样的,都是传递了字符串的首地址字符串作为字符数组传递时不需要指定长度。因为字符串操作的结束是依据0,#incl
16、ude Using namespace std;int word_cnt(const char *s) int cnt = 0; while (*s != 0) while (isspace(*s) +s; /跳过空白字符if (*s != 0) +cnt;/找到一个单词 while (!isspace(*s) ,统计字符串中单词数的函数,第7章 间接访问指针,指针的概念指针运算与数组动态内存分配字符串再讨论指针作为函数参数和返回值指针数组与多级指针指向多维数组的指针指向函数的指针,指针作为函数参数和返回值,指针作为函数参数数组名作为函数参数返回指针的函数引用和引用传递返回引用的函数,指针作为
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 间接 访问 走访 指针
限制150内