版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第八章 指针,8.1 指针的概念,一、内存单元的内容 ,内存单元地址 例:int a=3;char b=s; char *p;,变量a 变量b,地址,S,20000004,内存单元,指针变量p,3,20000004,30000000,20000000 20000001 20000002 20000003,00000000 00000000 00000000 00000011,01001011,二、内存单元的访问,直接访问:通过变量名访问。 char j=s; printf(“%c”, j ); 间接访问:通过该变量的指针来访问。 p= 说明:指针变量p指向变量j,是变量j的指针。,75,200
2、0,j,75,2000,j,p,指针:是一个变量的地址,是常量。 指针变量:是指取值为地址的变量,其值是另一个变量的地址。 要引用指针,必须定义指针。 定义指针,是为了通过指针访问内存单元。 一个数组或函数占有一段连续内存单元,假如将一个数组或函数的首地址赋给指针变量,通过指针就可以找到数组或函数。,8.2 变量的指针,一、指针变量的定义 类型标识符 *标识符 例如:int *p; “标识符”是指针变量名 “*”表示定义的是指针变量 “类型标识符”表示该指针变量所指向的变量类型。,二、指针变量的引用,两种相关地址运算符: 未经赋值的指针变量不能用,指针变量只能赋予地址。, int *p1, *
3、p2; a = 100; b = 10; p1 = 程序运行结果:, scanf(%d,%d, 输入:5,9 输出:a=5,b=9,max=9,min=5, p=*p1;*p1=*p2;*p2=p; void main() int a,b,*pointer_1, *pointer_2; scanf(%d,%d, ,8.3 数组的指针,指针可以指向数组和数组元素。 一、指向数组元素的指针变量,其类型应与数组元素相同。 例1: int a7,*pa; pa=,二、通过指针引用数组元素,设:int a10,*p= 例: *(p+5)和*(a+5)与a5等效 指向数组的指针可以带下标 例: pi与*(
4、p+i)等效,如果数组元素是int类型,p+1表示p的地址加4; 如果数组元素是double类型,p+1表示p的地址加8;,例 输出数组的全部元素。 访问各元素有三种方法: 1、下标法(常用,很直观) #include void main () int i,a10; for(i=0;i10;i+) scanf(%d, ,特点:不移动指针,2、用数组名计算数组元素的地址。(效率与下标法相同,常用) #include void main() int i,a10; for(i=0;i10;i+) scanf(%d, ,特点:移动指针,3、用指针访问各元素。(常用,效率高) #include void
5、 main() int a10,*p,i; for(i=0;i10;i+) scanf(%d, ,例:通过以下程序输入、输出a数组中的10个元素。,问题:以上程序可以输出a数组中的10个元素吗?,#include void main() int a10,*p,i; p=a; for(i=0;i10;i+) scanf(%d,p+); printf(n); for(i=0;i10;i+,p+) printf(%d ,*p); ,三、数组名作函数参数,#include void main() int array10; f(array,10); ,f( int arr ,int n) ,1、形参和实
6、参都用数组名,f( int *arr,int n) ,2、实参用数组名,形参用指针变量。,#include void main() int array10; f(array,10); ,#include void main() int array10,*p; p=array; f(p,10); ,f( int *arr,int n) ,3、实参、形参都用指针变量。,f( int arr ,int n) ,4、实参用指针变量,形参用数组名 。,#include void main() int array10,*p; p=array; f(p,10); ,在程序运行过程中,数组的大小是不能改变的。
7、这种数组称为静态数组。静态数组的缺点是:对于事先无法准确估计数据量的情况,无法做到既满足处理需要,又不浪费内存空间。 所谓动态数组是指,在程序运行过程中,根据实际需要指定数组的大小。 在C语言中,可利用内存的申请和释放库函数,以及指向数组的指针变量可当数组名使用的特点,来实现动态数组。,动态数组的实现,例:动态数组的实现 #include #include void main() int *array=NULL,num,i; printf(请输入一个整数: ); scanf(%d, /*exit():终止程序运行,返回操作系统*/ ,动态数组的本质是:一个指向数组的指针变量。,printf(请
8、输入%d个元素值: , num); for (i=0; inum; i+) scanf(%d, /*释放由malloc()函数申请的内存块*/ ,1、库函数malloc() array=(int *)malloc( sizeof(int) * num ); 用法:void *malloc(unsigned size) 功能:在内存的动态存储区分配个长度为size的连续空间。 返回值:申请成功,则返回新分配内存块的起始地址;否则,返回NULL。 函数原型:stdlib.h。 malloc()函数的返回值是一个无类型指针,其特点是可以指向任何类型的数据。但在实际使用malloc()函数时,必须将其
9、返回值强制转换成被赋值指针变量的数据类型,以免出错。,说明:,2、运算符sizeof 格式:sizeof(变量名类型名) 功能:求变量类型占用的内存字节数(正整数)。 例如,在IBM-PC机VC+上,sizeof(int)=2。 3、scanf(“%d”, 语句 “b”在该语句中的作用是,使光标定位到最后一个数据后的分隔符“,”上,然后再输出一个空格,以达到删除之目的。,5、free(array);语句库函数free() 用法:void free(void *ptr) 功能:释放由ptr指向的内存块(ptr是调用malloc() 函数的返回值)。 返回值:无。 函数原型:stdlib.h 原则
10、上,使用malloc()函数申请的内存块,操作结束后,应及时使用free()函数予以释放。尤其是循环使用malloc()函数时,如果不及时释放不再使用的内存块,很可能很快就耗尽系统的内存资源,从而导致程序无法继续运行。,8.4 字符串的指针,一、字符串的存放形式: 字符数组、字符指针 例:字符数组 #include void main() char string =I love China!; printf(%sn,string); ,数组可以用下标访问,也可以用指针访问。,用字符串对字符数组赋值,例:字符指针 #include void main() char *name1 =Mary,*n
11、ame2=Hare; printf(%s,%sn,name1,name2); ,name1,name2是指针变量,char *name1 =“Mary”; 等价于: char * name1; name1 = ”Mary; 它把字符串常量的首地址赋给指针name1。,#include void main() int i; char a =I am a boy.,b20; for (i=0;*(a+i)!=0;i+) *(b+i)=*(a+i); *(b+i)=0; printf(string a is: %sn,a); printf(string b is:); for(i=0; bi!=0;
12、 i+) printf(%c,bi); printf(n); ,例 将字符串a复制到字符串b,用数组名计算数组元素的地址,a,b,特点:不移动指针,#include void main () char a=I am a boy.; char b20,*p1,*p2; int i; p1=a;p2=b; for(;*p1!=0;p1+,p2+) *p2=*p1; *p2 = 0; printf(string a is: %sn,a); printf(string b is:); for (i=0; bi !=0; i+) printf(%c,bi); printf(n);,特点:移动指针,例:用
13、指针处理字串复制,a,b,p1,p2,字符数组和字符指针的区别:,1、字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址,决不是将字符串存放到字符指针变量中。 2、赋值方式比较: char str14;char *a; str=“I love China!” a=“I love China!” 3、对字符指针变量赋初值: char *a=“China” ;char str =“China” ; 相当于:不能等价为: char *a;char str14; a=“China”; str =“China”;,字符数组和字符指针的区别:,4、内存空间分配比较。 char s
14、tr10;char *a; scanf(“%s”,str);scanf(“%s”,a);,修改后: char *a,str10; a=str; scanf(“%s”,a);,字符数组和字符指针的区别:,5、指针变量的值是可以改变的。,#include void main() char *a=I love china!; a=a+7; printf(%sn,a); 运行结果: China!,若改为: char a =I love china!; a=a+7;,#include void main() char *p=I love china!; int i; for(i=0;pi!=0;i+)
15、printf(%c,pi); printf(n); 运行结果: I love China!,用带下标的字符指针变量引用字符串中的字符。,字符数组和字符指针的区别:,字符数组和字符指针的区别:,6、用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。,#include void main() int a=9,b=7; char *format; format=a=%d,b=%dn; printf(format,a,b); ,修改后: #include void main() int a=9,b=7; char format=a=%d,b=%dn; printf(format
16、,a,b); ,#include void main() int a=9,b=7; char format; format=a=%d,b=%dn; printf(format,a,b);,8.5 函数指针,C语言规定:函数的名称就是函数的入口地址。 一、用函数指针变量调用函数 例:int (*p)(int,int); 用来定义一个指向函数的指针变量p,它不固定指向哪一个函数,它是专门用来存放函数的入口地址的,该函数返回一个整型值。,#include int max(int x, int y); void main() int a,b,c; scanf(%d,%d,例 求a和b中的大者。(用函数
17、名调用max()函数),#include int max(int x,int y); void main () int (*p)(int,int); /*定义函数指针p*/ int a,b,c; p=max; /*函数max的入口地址赋给函数指针p*/ scanf(%d,%d, ,用函数指针调用函数max(),max p,8.6 返回指针的函数(自学),例:int *a (int x, int y) 声明一个函数,函数名为a,其返回值类型是“指向整型的指针”,函数形式参数为int x和int y。 注意:在a的两侧分别为*运算符和( )运算符,a先与( )结合,这是函数形式;函数前有个*号,表
18、示该函数为指针型函数。,#include stdio.h void main() float score4=60,70,80,90,56,89,67,88,34,78,90,66; float *search(float (*p)4,int n); float *p; int i,m; printf(请输入学生的号码:); scanf(%d, ,例:有若干学生的成绩(每个学生4门课程),要求在用户输入学生序号以后,能输出该学生的全部成绩。,#include stdio.h int *fun(int *a,int *b) int c,*p; c=*a%*b; p= ,以下程序的输出结果是什么?,
19、答案:6,8.7 指针数组和指向指针的指针,一、指针数组 概念:指针数组是一个数组,该数组中的每一个元素是指针变量。 例: int * p4; 定义一个指针数组,数组名p,有4个元素, 每一个元素是指向整型变量的指针。,定义举例: char *p; char *name =Ann,Hare,Jack; p=name; p是一个指向指针的指针,被p指向的指针指向字符变量。,二、指向指针的指针,二维字符数组,name指针数组,#include stdio.h void main() int i; char *name=Ann,Hare,Jack; char *p; printf(n Student
20、ss names are:n); for(i=0;i3;i+) p=name+i; printf(%s ,*p); ,二维字符数组,name指针数组,指针数组作main函数的形参 在以往的程序中,主函数main()都使用其无参形式。实际上,主函数main()也是可以指定形参的。 #include void main(int argc,char *argv) printf(输入的参数个数是:%dn,argc); printf(输入的字符串是:); while(argc=1) printf(%sn,*argv); +argv; -argc; ,源文件名是:Try.cpp 生成的可执行文件名是:Try.exe,1、主函数main()的有参形式 void main(int argc, char *argv) 2、实参的来源 运行带形参的主函数,必须在操作系统状态下,输入主函数所在的可执行文件名,以及所需的实参,然后回车即可。 命令行的一般格式为: 可执行文件名实参 实参2 例如,本例程序的用法: try 实参1 实参2 .,3、
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026云南云铝物流投资有限公司招聘3人备考题库有完整答案详解
- 2026恒丰银行杭州分行社会招聘20人备考题库附答案详解(综合题)
- 2026浙江杭州市国有资本投资运营有限公司春季招聘备考题库(满分必刷)附答案详解
- 2026贵州江山作物科技有限公司社会招聘12人备考题库及答案详解【基础+提升】
- 2026北京大学艺术学院招聘劳动合同制人员1人备考题库及参考答案详解(基础题)
- 2026江西九江庐山市人才集团招聘行政辅助人员1人备考题库含答案详解【培优a卷】
- 2026中国电信福建公司春季校园招聘备考题库及完整答案详解(夺冠)
- 2026湖北黄石市大冶市事业单位统一招聘118人备考题库【典优】附答案详解
- 2026甘肃天水秦安县云山中心卫生院招聘1人备考题库附参考答案详解【完整版】
- 2026湖南娄底市人力资源和社会保障局娄底市就业见习岗位备考题库及参考答案详解(基础题)
- 大跨度大空间火灾扑救
- 《运输实务》第2版 课件 贾铁刚 项目1-4 走进运输 - 航空运输操作
- 椅子的设计历史
- 失禁相关性皮炎与压力性损伤的区分鉴别
- 2025届广东省佛山市南海中学英语八下期末考试模拟试题含答案
- 【大赛原创 请勿转载】《军神》+公开课一等奖创新教学设计
- 弘法寺义工规章管理制度
- 大货车转租合同协议书
- T/ZJSEE 0016-2023高压电缆线路故障定位在线监测装置技术规范
- 2025全国英语等级考试(PETS)二级试卷:智能城市英语阅读理解
- 小学生我的梦想课件
评论
0/150
提交评论