资源预览内容
第1页 / 共26页
第2页 / 共26页
第3页 / 共26页
第4页 / 共26页
第5页 / 共26页
第6页 / 共26页
第7页 / 共26页
第8页 / 共26页
第9页 / 共26页
第10页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第9 9章章第九章 指针指针9.1 变量的地址与指针变量9.1.1 指针、指针变量概念及变量的存取方式 9.2 指针变量的定义、初始化和运算 9.2.1指针变量的定义和初始化 9.2.2指针变量的运算 9.2.3指针变量的引用 9.3 指针与数组 9.3.1指向数组的指针变量的定义和初始化 9.3.2通过数组的指针变量引用数组元素 9.3.3 用指针模拟可变长度的数组 下一页第九章 指针指针94 指针变量作为函数的参数和返回值 9.4.1 普通指针变量作为函数参数 9.4.2 数组名作为函数参数 9.4.3 返回指针值的函数 95 字符串的指针和指向字符串的指针变量 9.5.1 字符串的表示形式 9.5.2 字符串指针作为函数参数 9、6 指针数组9.6.1 指针数组定义与使用 9.6.2 字符型指针数组 9.6.3 指针数组作为main()函数的参数 9.7 指针运算举例本章小结退出9.19.1变量的地址和指针变量变量的地址和指针变量1. 内存,内存地址的基本概念在逻辑上来看,内存是由内存单元(一般称为字节)构成的一片连续的 存储空间,每个内存单元就如普通小区中的一个单元一样都有一个编号。这 些内存单元的编号就是内存地址,简称地址。CPU就是通过内存地址来访问 内存,进行数据存取(读/写)。如图所示。 9.1.1指针(地址)、指针变量(地址变量)概念及变量的存取方式 BA内存单元内存地址内存数据或程序2001 2002 2003 2004.9.19.1变量的地址和指针变量变量的地址和指针变量2. 变量、变量名、变量的地址以及变量值的基本概念变量是一个命名的内存空间。它在内存中占有一定空间,用于存放各种 类型的数据。所以每个变量都具有变量名、变量地址和变量值三个属性。其 中变量名是相当于给内存空间取的一个容易记忆的名字;变量的地址则是变 量所使用的内存空间的地址,一般把每个变量(数据)的首字节地址当作变 量地址;而变量值则是在变量的地址所对应的内存空间中存放的数值即为变 量的值或变量的内容。三者关系如下图所示。 a 2008 2009 变量名变量a的地址变量a的值1059.19.1变量的地址和指针变量变量的地址和指针变量3. 指针和指针变量的基本概念所谓指针就是 “内存单元的地址”,也即地址。所以指针指向一个内 存单元。既然存储在内存中的各种变量都有一个地址也就是指针,我们能否 定义某种变量,让这个变量的值始终等于某个变量的地址,如同某个房间号 、门牌号一样?回答是肯定的。我们把这种存放某种变量地址的变量称为指 针变量。所以指针变量就是用来存放地址的变量。这个地址可以是变量的地 址,也可以是数组的地址或函数的地址。如下图所示。 5指针变量p变量a的地址地址(指针)p 2002 2008 a 2008 3000 指针变量的值是地址 值变量a的地址1. 指针变量的定义格式:存储类型 数据类型 *指针变量名1,*指针变量名2; 例如:int *p1, *p2; /*定义两个指针变量p1,p2,数据类型为整型,即指向的数据类型为整型*/ 2. 指针变量的初始化的一般形式为:存储类型 数据类型 *指针变量名1=初始地址值; 例如:int a, *fa= /* 将a地址赋值给指针fa。*/ 9.2.1指针变量的定义和初始化 9.2 9.2 指针变量的定义、初始化和运算指针变量的定义、初始化和运算 1. 指针变量的赋值运算(指针变量指向该变量获该地址) 例如:int i,*p; p= 2. 指针变量的算术运算C语言规定一个地址加上(或减去)一个整数n其结果仍然是一个地址。 但是C语言中指针(指针变量)加1(或减1),不是指针的地址值加1,而是 加1个指针数据类型的字节数。也就是地址以当前为基数往前或往后移动1个 数据位置。同时C语言也允许两个同类型指针相减,结果为两个指针间数据 的个数。 例9.1 指针变量的算术运算示例。main() int i=100,*p= /* 定义1个整型变量和一个指针,并把指针指向变量i */printf(“i=%d”,i); /* 直接访问变量i */printf(“ /* 输出i的内容,i的地址,指针p的数值和p+2的数值 ,以及两个指针相减的值*/ 9.2.2指针变量的运算 9.2 9.2 指针变量的定义、初始化和运算指针变量的定义、初始化和运算 只要我们赋予指针变量一个确定的变量或合法的内存空间我们就可以使 用“*”运算符访问指针变量指向的变量的值。“*”运算符又称指针运算符 或间接访问运算符。它的作用是能取出某个内存地址中的数值。 例92 用指针访问变量方法。 main() int i=1000,j=10; /* 定义两个整型变量 */ int *pi,*pj; /* 定义两个整型指针变量 */ pi= /* 指针pi指向i */ pj= /* 指针 pj指向j */ printf(“i=%d,j=%dn”,i,j); /* 直接访问变量i,j */ printf(“%d,%d”,*pi,*pj); /* 间接访问变量i,j */ 结果如下: i=10,j=1000 10,10009.2.3指针变量的引用 9.2 9.2 指针变量的定义、初始化和运算指针变量的定义、初始化和运算 数组的指针就是数组的地址。而数组的地址一般指的是数组的起始地址 (首地址),也就是第一个数组元素的地址。C语言中规定数组名代表数组 的首地址。若定义一个指针变量指向一个数组,则该指针就被称为是指向数 组的指针变量。 例如:对于整型数组int a10,*p=a; 数组的指针就是数组的起始地址for(p=a;p=a;p-)/*用指针变量从最后一个元素操作到数组首元素*/printf(“%d “,*p);getch(); 9.3.2通过数组的指针变量引用数组元素9.3 9.3 指针与数组指针与数组 数组的最大缺点之一是它的长度是固定的,这给数组的使用带来了很大的 局限性,无法和实际要求相符合。但是用指针可以实现类数组结构。在这里要 用到前面提到的开辟内存空间函数malloc()。该函数能在内存中开辟函数并返 回开辟的内存的首地址,如果开辟失败则会返回NULL。如例9.5所示。9.3.3 用指针模拟可变长度的数组 9.3 9.3 指针与数组指针与数组 例9.5 类数组结构示例。 #include main() int *p,n,i;printf(“请输入数组元素个数”);scanf(“%d”,p=(int*)malloc(n*sizeof(int);for(i=0;iy)z= else z=return z; 运行结果:enter two num to i,j:12 38max=38 9 94 4 指针变量作为函数的参数和返回值指针变量作为函数的参数和返回值 9 95 5 字符串的指针和指向字符串的指针变量字符串的指针和指向字符串的指针变量 951 字符串的表示形式 1、字符串指针的基本概念在C语言中,我们允许使用两种方式实现对字符串的引用:字符数组、 字符串指针。在字符数组中,我们将字符串的各个字符(包括结尾标志0)依 次存放到字符数组中,利用数组名、下标变量或指向数组的指针对数组 进行操作。而字符串指针指的是字符串的第一个字符的地址,一个字符串常量 的值就是字符串指针,表示该字符串在内存中的地址。若一个字符数组 中存放一个字符串,其数组名即为字符串指针。但是使用时我们可以不 定义字符数组,直接定义指向字符串的指针变量,利用指针变量对字符 串进行操作。例如:char *s=”hello world!”;或char *s;s=”hello world!”; 返回返回9 95 5 字符串的指针和指向字符串的指针变量字符串的指针和指向字符串的指针变量 2、字符串指针的应用字符串指针在使用是非常的灵活方便,有时我们甚至可以用字符串指针 变量来模拟字符数组。例9.12 字符串指针简单示例main()char *string=”I am a student.”;printf(“%sn”,string); /* 整体输出 */printf(“%c,%cn”,string3,*(string+3); /* 输出其中一个字符 */printf(“%s”,string+5);运行结果如下:I am a student.m,ma student. 返回返回9 95 5 字符串的指针和指向字符串的指针变量字符串的指针和指向字符串的指针变量 952 字符串指针作为函数参数使用字符串(或字符数组)指针变量(实际上就是字符指针变量)可以 作为函数形参接受来自实参字符串(字符数组)的地址。此时,在函数 中改变字符指向的字符串的内容同时也改变了在主调函数中的字符串。 所以种种参数传递方式也是传地址方式。例9.15 将字符数组a中的字符串拷贝到字符数组b中。 #include void copy_string(char *from, char *to) for(; *from !=0; from+,to+)*to = *from;*to = 0; main() char *a = “I am a teacher.“;char *b = “you are a student.“;printf(“string_a =%sn string_b =%sn“, a,b);copy_string(a,b);printf(“string_a =%sn string_b =%sn“, a,b);getch(); 返回返回9 9、6 6 指针数组指针数组9.6.1 指针数组定义与使用 指针数组的定义格式为: 类型标识 *数组名整型常量表达式; 例如: int *a10;就定义了一个指针数组, 数组中的每个元素都是用 来指向整型量的指针, 该数组由10个元素组成, 即a0, a1, a2, ., a9, 它们均为指针变量。指针数组和普通数组基本相似,其中指 针数组名a和普通数组一样也是地址常量, 不能对它进行增量运算;a为 指针数组元素a0的地址, a+i为ai的地址, *a就是a0, *(a+i)就是 ai;且在初始化上也和普通数组基本相似。 又如:char *p4;定义一个4个元素的字符指针数组p,其中每个数组 元素是一个字符指针,可以指向一个字符串。也就是说利用此字符指针 数组可以指向4个字符串。返回返回9 9、6 6 指针数组指针数组9.6.2 字符型指针数组实际上指针数组用得最多的是“字符型指针数组”,利用字符指针数组可 以指向多个长度不等的字符串,使字符串处理更加方便、灵活,节省内 存空间。使用字符型指针数组指向多个字符串与使用两维字符数组存储多个字 符串的比较能节省存储空间(二维数组要按最长的串开辟存储空间),且 便于对多个字符串进行处理,节省处理时间。如sort函数所示。返回返回void sort(char *name,int n) /*选择法排序 */ char *temp;int i,j,k;/* n个串,只要进行n-1次选择相对最小串(对应的指针),就可完成排序*/for(i=0; inamek*/temp=namei;namei=namek;namek=temp; 9 9、6 6 指针数组指针数组9.6.3指针数组作为main()函数的参数 指针数组的一个重要应用就是作为main函数的形参。习惯上人们将argc, argv和env作为 main()函数的形参名。main函数的完整的原型是:类型 main(int argc, char *argv, ch
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号