《一维数组和指针变量.ppt》由会员分享,可在线阅读,更多相关《一维数组和指针变量.ppt(34页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第五章 指针,5.1 指针的概念5.2 指针与数组5.3 字符串指针,地下工作者阿金接到上级指令,要去寻找打开密电码的密钥,这是一个整数。几经周折,才探知如下线索:密钥藏在一栋三年前就被贴上封条的小楼中。一个风雨交加的夜晚,阿金潜入了小楼,房间很多,不知该进哪一间,正在一筹莫展之际,忽然走廊上的电话铃声响起。艺高人胆大,阿金毫不迟疑,抓起听筒,只听一个陌生人说:“去打开3010房间,那里有线索”。阿金疾步上楼,打开3010房间,用电筒一照,只见桌上赫然6个大字:“地址2000”。阿金眼睛一亮,迅速找到2000房间,取出重要数据98,完成了任务。,5.1 指针的概念,5.1 指针的概念,如果我们
2、将房间看作计算机的内存单元,那么,房间的编号就是内存单元的地址,存放地址的内存单元就对应程序中的变量,这类特殊的变量在C中称指针变量。这里,pointer是指针变量,2000是pointer指针变量的值,1、数据藏在一个内存地址单元中,地址是2000。2、地址2000又由pointer单元所指认,pointer单元的地址为3010。3、98的直接地址是2000;98的间接地址是3010;3010中存的是直接地址2000。4、称pointer为指针变量,2000是指针变量的值,实际上是有用数据藏在存储器中的地址。,5.1 指针的概念,int *pointer = 0 ;,指针的定义及初始化:,上
3、面的语句定义了一个名为pointer的指针,且被初始化为0,该指针“指向”的目标类型为整型。在定义指针时,将其初始化为0是一个好办法。,指针:就是地址,一个变量的指针就是该变量的地址。,指针变量:专门存放地址的一类特殊的变量。,5.1 指针的概念,指针变量的常见类型,简单的指针变量分为:int *p, *q; / 定义p,q为指向整数类型变量的指针float *point; / point为指向float型变量的指针double *pd; / 定义pd为指向double型变量的指针int (*pa)10;/ 定义pa为指向int型数组的指针int *qq; / 定义qq为指向int型指针的指针
4、StudentInfo *pStu; / 定义指向结构的指针pStu,指针是一种特殊的变量,特殊性表现在类型和值上。从变量讲,指针也具有变量的三个要素:(1)变量名,这与一般变量取名相同,由英文字符开始。(2)指针变量的类型,是指针所指向的变量的类型,而不是自身的类型。(3)指针的值是某个变量的内存地址。从上面的概念可知,指针本身类型是int型,因为任何内存地址都是整型的。但是指针变量的类型却定义成它所指向的变量的类型。,5.1 指针的概念,int *pointer = 0 ;,指针的赋值:,1、使用取地址运算符()将变量的地址取出赋给指针变量,2000,int i, j;int *i_poi
5、nter = 0; i_pointer = ,执行以上变量赋值语句后, i_pointer 就指向了变量 i 代表的内存单元。,5.1 指针的概念,指针的赋值(续):,2、将一个已有具体指向的指针变量赋值给另一个指针变量。,int i = 123;int *p1 = 0 , *p2 = 0;p1 = ,执行以上变量赋值语句后, p1、p2 就指向了相同的内存单元。,5.1 指针的概念,变量(内存)的访问方式:,直接访问:通过变量名访问。,i = 98;couti=iendl;,间接访问:使用间接访问运算符(*),通过指针变量中存放的值,找到最终要访问的变量。,*i_pointer = 98;c
6、outi= *i_pointer endl;,5.1 指针的概念,有关指针变量的说明, 一个指针变量可以指向任何一个同类型的普通变量;但是,在某一个时刻,它只能指向某一个同类型的变量, 让指针变量指向某个同类型普通变量的方法是:把该普通变量的地址保存到指针变量中。, 必须对指针变量进行了正确合法的初始化后,才能使用该指针变量访问它所指向的内存单元。没有具体指向的指针变量叫悬空指针,对它所指向的内存单元的使用是非法的。,int *pa, *pb, a, b;pa = ,int *pa, *pb, a, b;*pa = 100;或 cout*pa=*pa &score1,这里的偏移量就是一个数组元
7、素所占的字节数。编译程序会根据数组元素的类型,自动确定出不同的偏移量,#include /预编译命令using namespace std;int main() /主函数/函数体开始int a5=1,3,5,7,9;/定义数组,赋初值int *p=NULL;/定义指针变量int i; /定义整型变量p=a; /赋值给指针变量,让p指向a数组for(i=0;i5;i=i+1)/循环体开始 coutai=*pendl;/输出a数组元素的值p=p+1;/指针变量加1 /循环体结束return 0; /函数体结束,5.2 指针与数组5.2.1 使用指针访问数组元素,说明(1) p=a; 这里数组名作为
8、数组的起始地址,即a0的地址。因此 p=a 等效于 p=,p,p+1,p+2,等效,p+2,p,p+1,等效,等效,#include / 预编译命令 using namespace std;int main() / 主函数 / 函数体开始int a5=1,3,5,7,9; / 定义数组,赋初值int *p=NULL;/ 定义指针变量 int i=0;/ 定义整型变量,赋初值 for(p=a;pa+5;p=p+1)/ 让p指向a数组 / 循环体开始 coutai=*pendl;/ 输出a数组元素的值i=i+1;/ 让i加1 / 循环体结束return 0;/ 函数体结束,做下面的实验,#incl
9、ude using namespace std;int main()char *p;/ 定义指向字符类型的指针变量pchar s = abcdefgh;/ 定义字符数组,并赋值p=s;/ 数组名是一个常量指针,/ 它指向该数组首地址while(*p != 0)/ 当p所指向的元素不为0时p=p+1;/ 让指针加1cout字符串长度为p-s=shuzi则继续执行循环体。一旦 p no = 1443011101;,stu.no = 1443011101;,引用结构变量stu的成员:,const int STU_NUM = 20; / 学生人数 StudentInfo stuSTU_NUM+1; /
10、 定义结构数组stu,用于存储同学信息, / 下标i处存储第i位同学的信息,stu0不使用 StudentInfo *p_stuInfo = 0; / 指向学生信息的指针,初始化为0 int i = 0, j = 0; / 循环变量 int changed = 0; / 交换标志 p_stuInfo = stu+1;/p_stuInfo指向stu1 for(; p_stuInfo = stu+STU_NUM; p_stuInfo+) *p_stuInfo = readStudent(); / 输入当前学生信息 ,输入学生信息,p_stuInfo = stu; /p_stuInfo指向结构数组的
11、开始 for(i =1; i (p_stuInfoj+1.height) / 交换stuj和stuj+1 stu0 = p_stuInfoj; p_stuInfoj = p_stuInfoj+1; p_stuInfoj+1 = stu0; changed = 1; / 置交换标志为1 if(changed = 0) / 如果本遍排序中未交换,则退出循环 break; ,按身高排序,cout endl 输入的学生信息为(按身高升序排列): endl;for(p_stuInfo+; p_stuInfo = stu+STU_NUM; p_stuInfo+) writeStudent(*p_stuIn
12、fo); / 依次输出个人信息,输出排序后学生信息,5.3 字符串指针,可以使用指针指向字符数组或字符串常量,通过指针来使用字符数组或字符串常量。指向字符串的指针变量实际上就是一个指向字符型变量的指针变量,正如同指向整型数组的指针变量就是指向一个整型变量的指针变量一样,因为一个字符串就是一个字符数组。指向字符串的指针变量,它保存的是字符串中第一个字符所在内存单元的地址。,通过指针变量访问字符串,能够通过指针变量访问字符串的前提是:已经定义了一个字符型指针变量,并且已经把某个字符串的指针赋值给它。,访问方法: 指针法或下标法,如果pstr的初值为字符串的第一个字符的地址,比如有char *pst
13、r = Hello, World; 则有以下事实: pstr + i 就是第 i 个字符的地址,即它指向字符串中的第 i 个字符 *(pstr + i) 或者 pstri 就是它所指向的字符 指针变量也可以使用下标法,即 pstri 和*(pstr + i) 是等价的,通过指针变量引用数组元素:, 编程把字符串s2复制到字符串s1中,/* 方法1:用数组名和下标 */#include using namespace std;int main( ) char s180 = , s2 = hello, world; int n; for(n = 0; s2n != 0; n +) s1n = s2
14、n; s1n = 0; couts1=s1ns2=s2endl; return 0;,通过指针变量引用数组元素:, 编程把字符串s2复制到字符串s1中,/* 方法2:用数组名偏移量得到元素地址,访问元素*/#include using namespace std;int main( ) char s180 = , s2 = hello, world; int n; for(n = 0; s2n != 0; n +) *(s1 + n) = *(s2 + n); *(s1 + n) = 0; couts1=s1ns2=s2endl; return 0;,特点:数组名本身不变也不可能被改变,通过指
15、针变量引用数组元素:, 编程把字符串s2复制到字符串s1中,/* 方法3:用指针变量偏移量得到元素地址,访问元素*/#include using namespace std;int main( ) char s180 = , s2 = hello, world; int n; char *p1 = s1, *p2 = s2; for(n = 0; *(p2 + n) != 0; n +) *(p1 + n) = *(p2 + n); *(p1 + n) = 0; couts1=s1ns2=s2endl; return 0;,特点:指针变量本身的值没有变化,通过指针变量引用数组元素:, 编程把字
16、符串s2复制到字符串s1中,/* 方法4:用指针变量自身变化得到元素地址,访问元素*/#include using namespace std;int main( ) char s180 = , s2 = hello, world; int n; char *p1 = s1, *p2 = s2; for(n = 0; *p2 != 0; n +) *(p1 +) = *(p2 +); *p1 = 0; couts1=s1ns2=s2endl; return 0;,特点:普通变量做循环控制变量,通过指针变量引用数组元素:, 编程把字符串s2复制到字符串s1中,/* 方法5:用指针变量自身变化得到
17、元素地址,访问元素 */#include using namespace std;int main( ) char s180 = , s2 = hello, world; char *p1 = s1, *p2 = s2; for( ; *p2 != 0; p1 +, p2 +) *p1 = *p2; *p1 = 0; couts1=s1ns2=s2endl; return 0;,特点:指针变量做循环控制变量,指向字符串的指针变量的有关运算,如有: char str80, *ps; ps = str; 或 ps = , ps + 或 ps += 1,是下一个字符的地址(即 ps 指向下一个字符) ps - 或 ps -= 1,是上一个字符的地址(即 ps 指向上一个字符), * ps + 等价于 *(ps +) ,即先得到 ps 当前指向的字符,然后再使 ps 自增,从而指向下一个字符, * + ps 等价于 *(+ ps) ,即先使 ps 自增,指向下一个字符,然后得到 ps 所指向的字符, (* ps) + ,则是表示 ps 当前指向的字符加1,
限制150内