第8章 善于利用指针(1)
第8章 指针及其应用

【说明】 ①、直接拿 a 当指针用,a 指向数组的开始元素,a+i 是指向数组的第 i 个元素的指针。 ②、指针变量 pa 是变量,可以变的。但数组 a 是静态的变量名,不可变,只能当做常 量指针使用。例如:p=p+2;是合法的,a=a+2;是非法的。 ③、 最早在使用标准输入 scanf 时就使用了指针技术, 读入一个变量时要加取地址运算 符’&’传递给 scanf 一个指针。对于数组,可以直接用数组名当指针。
4、多重指针
既然指针是指向其他类型的,指针本身也是一种类型。 C++允许递归地指针指向指针的指针——多重指针。 【例 4】双重指针运用举例。 #include<cstdio> using namespace std; int a=10; int *p; int **pp; //定义双重指针 int main() { p=&a; //将 p 指向 a pp=&p; //将 pp 指向 p printf("%d=%d=%d\n",a,*p,**pp); //**pp 通过 2 次间接访问了 a 的变量的值 10 return 0; } 输出: 10=10=10 【说明】 多重指针除了可以多次“间接”访问数据,OI 上主要的应用是动态的多维数组,这个 强大的功能将在后面专门介绍。
第八章
指针及其应用
指针是 C++语言中广泛使用的一种数据类型,运用指针编程是 C++语言最主要风格之 一。利用指针变量可以表示各种数据结构,能很方便地使用数组和字符串,并能像汇编语言 一样处理内存地址,从而编出精炼而高效的程序,指针极大地丰富了 C++语言的功能。学习 指针是学习 C++语言最重要的一环,能否正确理解和使用指针是我们是否掌握 C++语言的一 个标志。 同时, 指针也是 C++语言中最为困难的一部分, 在学习中除了要正确理解基本概念, 还必须要多编程、多上机调试,只要做到这些,指针也是不难掌握的。
职业技术学院教师职位试讲题目

第十八课 二、生词
初级汉语教材
杨寄洲
北京汉语大学出版社
17381职业技术学院教师职位试讲题目 Nhomakorabea序号
专业名称
课程名称
章节
教材名称
作者
出版社
书号
1
计算机科学与技术
C程序设计
第8章善于利用指针
第一节和第二节
C程序设计(第四版)
谭浩强
清华大学出版社
24464
2
旅游管理
导游业务知识
第三章第二节全陪导游服务程序
导游业务知识
新疆维吾尔自治区旅游局编
旅游教育出版社
21948
3
财务管理
基础会计
第二章会计6要素
基础会计
赵丽生
东北财经大学出版社
10246
4
审计
审计学原理
第四章审计风险
审计(第三版)
胡中艾
东北财经大学出版社
04757
5
物流管理
配送管理
第五章第三节商品拣选
配送中心管理与运作
朱华
高等教育出版社
36880
6
电子商务
电子商务概论
第二章第二节B2C电子商务模式
电子商务概论
宋文官
清华大学出版社
90964
7
土木工程
建筑工程测量
第2章第四节
水准测量的方法
建筑工程测量
周建郑
中国建筑工业出版社
96879
8
机械电子工程
电子技术基础
第五章集成运放基本单元电路
电子技术基础
庞程山
北京高等教育出版社
6578
9
体育
C语言程序设计教程 第8章 善于利用指针

float *pointer_3; char *pointer_4; int a,b; int *pointer_1=&a,*pointer_2=&b;
pointer_3=2000; 错误 pointer_1=&a; *pointer_1=&a; 正确 错误 错误 pointer_3=&a;
8.2 指针变量
8.2.1使用指针变量的例子 8.2.2 怎样定义指针变量 8.2.3 怎样引用指针变量 8.2.4 指针变量作为函数参数
8.2.1使用指针变量的例子
例8.1 通过指针变量访问整型变量。 解题思路:先定义2个整型变量,再定 义2个指针变量,分别指向这两个整型 变量,通过访问指针变量,可以找到它 们所指向的变量,从而得到这些变量的 值。
5
9 5 9 y
}
5 9 x
如果想通过函数调用得到n个要改变的值:
① 在主调函数中设n个变量,用n个指针变量指 向它们 ② 设计一个函数,有n个指针形参。在这个函数 中改变这n个形参的值 ③ 在主调函数中调用这个函数,在调用时将这n 个指针变量作实参,将它们的地址传给该函数 的形参 ④ 在执行该函数的过程中,通过形参指针变量, 改变它们所指向的n个变量的值 ⑤主调函数中就可以使用这些改变了值的变量
50
*i_pointer=50;
将i的地址 存到这里
间接存取
i
直接存取
2000
3
间接存取
i_pointer
2000
*i_point值3送到变量中,可以有两 种表达方法: (1) 将3直接送到变量i所标识的单元中,例 如:i=3; (2) 将3送到变量i_pointer所指向的单元 (即变量i的存储单元),例如: *i_pointer=3; 其中*i_pointer表示 i_pointer指向的对象
第8章-善于利用指针 谭浩强第五版

8.2.3 怎样引用指针变量 • 在引用指针变量时,可能有使三p种指情向况a:
–给指针变量赋值。如:p=&a; *p相当于a
–引用指针变量指向的变量。如有
p=&a; *p=1;
则执行printf(“%d”,*p); 将输出1
–引用指针变量的值。
–如:printf(“%o”,p); 以八进制输出a的地址 10
23
例8.5 输入3个整数a,b,c,要求按由大到小 的顺序将它们输出。用函数实现。 • 解题思路:采用例8.3的方法在函数中改变这3个 变量的值。用swap函数交换两个变量的值,用 exchange函数改变这3个变量的值。
24
#include <stdio.h>
int main()
{ void exchange(int *q1, int *q2, int *q3);
}
交换指针指
向的变量值
26
8.3 数组的指针 8.3.1 数组元素的指针 • 一个变量有地址,一个数组包含若干元素,每个
数组元素都有相应的地址 • 指针变量可以指向数组元素(把某一元素的地址
放到一个指针变量中) • 所谓数组元素的指针就是数组元素的地址
27
• 可以用一个指针变量指向一个数组元素 int a[10]={1,3,5,7,9,11,13,15,17,19}; int *p; p=&a[0];
pointer_1 a
&a 95
pointer_2 b
&b 59
p1 &a
p2 &1,int *p2)
{ int temp;
temp=*p1;
*p1=*p2;
*p2=temp; }
善于利用指针 PPT课件

50
*i_pointer=50;
将i的地址 存到这里
间接存取
i
直接存取
2000
3
间接存取
i_pointer
2000
*i_pointer
3 2000
为了表示将数值3送到变量中,可以有两 种表达方法: (1) 将3直接送到变量i所标识的单元中,例 如:i=3; (2) 将3送到变量i_pointer所指向的单元 (即变量i的存储单元),例如: *i_pointer=3; 其中*i_pointer表示 i_pointer指向的对象
8.1 指针是什么
内存区的每一个字节有一个编号,这就是 “地址”,它相当于旅馆中的房间号。 在地址所标识的内存单元中存放数据,这相 当于旅馆房间中居住的旅客一样。 由于通过地址能找到所需的变量单元,我们 可以说,地址指向该变量单元。 将地址形象化地称为“指针”
务必弄清楚存储单元的地址和存储 单元的内容这两个概念的区别 例如:
指向就是通过地址来体现的
假设i_pointer中的值是变量i的地址 (2000),这样就在i_pointer和变量i之间 建立起一种联系,即通过i_pointer能知道i 的地址,从而找到变量i的内存单元
由于通过地址能找到所需的变量单元,因 此说,地址指向该变量单元
将地址形象化地称为“指针”。意思是通 过它能找到以它为地址的内存单元
#include <stdio.h> 此处*与类型名在一起。 此时共同定义指针变量 int main() { int a=100,b=10; int *pointer_1, *pointer_2; pointer_1=&a; pointer_2=&b; printf(“a=%d,b=%d\n”,a,b); printf(“*pointer_1=%d,*pointer_2= %d\n”,*pointer_1,*pointer_2); return 0; 此处*与指针变量一起使用。此 } 时代表指针变量所指向的变量
《高级语言程序设计》考试大纲

《高级语言程序设计》考试大纲
I.考试的性质
我校本科插班生考试(以下简称“插班生考试”)《高级语言程序设计》科目的考试,是普通高等学校(含高职班和各类成人高校从普通高考招生的普通班)应届和往届专科毕业生,以及通过自学考试、成人教育等国民教育系列获得大专毕业证书的人员,升入我校计算机科学与技术本科专业就读的必考科目。
II.考试内容及要求
《高级语言程序设计》课程主要任务是训练学生能灵活运用C语言的基本技能设计程序、编写程序和调试程序的能力,培养学生综合运用所学知识进行综合实验的能力,最终让学生提高分析问题、并运用计算机技能解决实际问题的能力。
Ⅲ.参考书目
考试主要参考书为《C程序设计(第四版)》,谭浩强,清华大学出版社,2013年4月。
《C语言》章节列表

第1章程序设计和C语言1第2章算法——程序的灵魂16第3章最简单的C程序设计——顺序程序设计第4章选择结构程序设计85第5章循环结构程序设计114第6章利用数组处理批量数据1426.1怎样定义和引用一维数组1426.1.1怎样定义一维数组1436.1.2怎样引用一维数组元素1446.1.3一维数组的初始化1456.1.4一维数组程序举例1466.2怎样定义和引用二维数组1486.2.1怎样定义二维数组1496.2.2怎样引用二维数组的元素1506.2.3二维数组的初始化1516.2.4二维数组程序举例1526.3字符数组1546.3.1怎样定义字符数组1546.3.2字符数组的初始化1556.3.3怎样引用字符数组中的元素1556.3.4字符串和字符串结束标志1566.3.5字符数组的输入输出1596.3.6使用字符串处理函数1616.3.7字符数组应用举例165习题168第7章用函数实现模块化程序设计1707.1为什么要用函数1707.2怎样定义函数1727.2.1为什么要定义函数1727.2.2定义函数的方法1737.3调用函数1747.3.1函数调用的形式1747.3.2函数调用时的数据传递1757.3.3函数调用的过程1777.3.4函数的返回值1787.4对被调用函数的声明和函数原型1797.5函数的嵌套调用1827.6函数的递归调用1847.7数组作为函数参数1927.7.1数组元素作函数实参1937.7.2数组名作函数参数1947.7.3多维数组名作函数参数1977.8局部变量和全局变量1997.8.1局部变量1997.8.2全局变量2007.9变量的存储方式和生存期2047.9.1动态存储方式与静态存储方式2047.9.2局部变量的存储类别2057.9.3全局变量的存储类别2087.9.4存储类别小结2127.10关于变量的声明和定义2147.11内部函数和外部函数2157.11.1内部函数2157.11.2外部函数215习题218第8章善于利用指针2208.1指针是什么2208.2指针变量2228.2.1使用指针变量的例子2228.2.2怎样定义指针变量2238.2.3怎样引用指针变量2248.2.4指针变量作为函数参数2268.3通过指针引用数组2308.3.1数组元素的指针2308.3.2在引用数组元素时指针的运算2318.3.3通过指针引用数组元素2338.3.4用数组名作函数参数2378.3.5通过指针引用多维数组2458.4通过指针引用字符串2558.4.1字符串的引用方式 2558.4.2字符指针作函数参数2598.4.3使用字符指针变量和字符数组的比较263 8.5指向函数的指针2668.5.1什么是函数指针2668.5.2用函数指针变量调用函数2668.5.3怎样定义和使用指向函数的指针变量268 8.5.4用指向函数的指针作函数参数2708.6返回指针值的函数2748.7指针数组和多重指针2778.7.1什么是指针数组 2778.7.2指向指针数据的指针2808.7.3指针数组作main函数的形参2828.8动态内存分配与指向它的指针变量2858.8.1什么是内存的动态分配2858.8.2怎样建立内存的动态分配2858.8.3void指针类型 2878.9有关指针的小结288习题291第9章用户自己建立数据类型2939.1定义和使用结构体变量2939.1.1自己建立结构体类型2939.1.2定义结构体类型变量 2959.1.3结构体变量的初始化和引用2979.2使用结构体数组3009.2.1定义结构体数组3009.2.2结构体数组的应用举例3019.3结构体指针3039.3.1指向结构体变量的指针3039.3.2指向结构体数组的指针3049.3.3用结构体变量和结构体变量的指针作函数参数306 9.4用指针处理链表3099.4.1什么是链表 3099.4.2建立简单的静态链表3109.4.3建立动态链表3119.4.4输出链表3159.5共用体类型3179.5.1什么是共用体类型3179.5.2引用共用体变量的方式3189.5.3共用体类型数据的特点3199.6使用枚举类型3239.7用typedef声明新类型名326习题330第10章对文件的输入输出33110.1C文件的有关基本知识33110.1.1什么是文件33110.1.2文件名33210.1.3文件的分类33210.1.4文件缓冲区33310.1.5文件类型指针33310.2打开与关闭文件33510.2.1用fopen函数打开数据文件33510.2.2用fclose函数关闭数据文件33710.3顺序读写数据文件33810.3.1怎样向文件读写字符33810.3.2怎样向文件读写一个字符串34110.3.3用格式化的方式读写文件34410.3.4用二进制方式向文件读写一组数据34510.4随机读写数据文件34910.4.1文件位置标记及其定位34910.4.2随机读写 35210.5文件读写的出错检测353习题354第11章常见错误分析355附录370附录A在Visual C++ 6.0环境下运行C程序的方法370附录B常用字符与ASCII代码对照表377附录CC语言中的关键字378附录D运算符和结合性378附录EC语言常用语法提要380附录FC库函数384参考文献390第4章选择结构程序设计854.1选择结构和条件判断854.2用if语句实现选择结构874.2.1用if语句处理选择结构举例874.2.2if语句的一般形式 894.3关系运算符和关系表达式914.3.1关系运算符及其优先次序914.3.2关系表达式924.4逻辑运算符和逻辑表达式924.4.1逻辑运算符及其优先次序934.4.2逻辑表达式944.4.3逻辑型变量964.5条件运算符和条件表达式974.6选择结构的嵌套1004.7用switch语句实现多分支选择结构1024.8选择结构程序综合举例106习题112第5章循环结构程序设计1155.1为什么需要循环控制1155.2用while语句实现循环1165.3用do…while语句实现循环1185.4用for 语句实现循环1215.5循环的嵌套1255.6几种循环的比较1265.7改变循环执行的状态1265.7.1用break语句提前终止循环1275.7.2用continue语句提前结束本次循环1285.7.3break语句和continue语句的区别1295.8循环程序举例132习题141第6章利用数组处理批量数据1436.1怎样定义和引用一维数组1436.1.1怎样定义一维数组1446.1.2怎样引用一维数组元素1456.1.3一维数组的初始化1466.1.4一维数组程序举例1476.2怎样定义和引用二维数组1496.2.1怎样定义二维数组1506.2.2怎样引用二维数组的元素1516.2.3二维数组的初始化1526.2.4二维数组程序举例1536.3字符数组1556.3.1怎样定义字符数组1556.3.2字符数组的初始化1566.3.3怎样引用字符数组中的元素156 6.3.4字符串和字符串结束标志1576.3.5字符数组的输入输出1606.3.6使用字符串处理函数1626.3.7字符数组应用举例166习题169第7章用函数实现模块化程序设计171 7.1为什么要用函数1717.2怎样定义函数1737.2.1为什么要定义函数1737.2.2定义函数的方法1747.3调用函数1757.3.1函数调用的形式1757.3.2函数调用时的数据传递1767.3.3函数调用的过程1787.3.4函数的返回值1797.4对被调用函数的声明和函数原型181 7.5函数的嵌套调用1837.6函数的递归调用1857.7数组作为函数参数1937.7.1数组元素作函数实参1937.7.2数组名作函数参数1957.7.3多维数组名作函数参数1987.8局部变量和全局变量2007.8.1局部变量2007.8.2全局变量2017.9变量的存储方式和生存期2057.9.1动态存储方式与静态存储方式205 7.9.2局部变量的存储类别2067.9.3全局变量的存储类别2097.9.4存储类别小结2137.10关于变量的声明和定义2157.11内部函数和外部函数2167.11.1内部函数2167.11.2外部函数216习题219第8章善于利用指针2218.1指针是什么2218.2指针变量2238.2.1使用指针变量的例子2238.2.2怎样定义指针变量2248.2.3怎样引用指针变量2258.2.4指针变量作为函数参数2278.3通过指针引用数组2328.3.1数组元素的指针2328.3.2在引用数组元素时指针的运算2338.3.3通过指针引用数组元素2348.3.4用数组名作函数参数2398.3.5通过指针引用多维数组2478.4通过指针引用字符串2578.4.1字符串的引用方式 2578.4.2字符指针作函数参数2618.4.3使用字符指针变量和字符数组的比较265 8.5指向函数的指针2688.5.1什么是函数指针2688.5.2用函数指针变量调用函数2688.5.3怎样定义和使用指向函数的指针变量270 8.5.4用指向函数的指针作函数参数2728.6返回指针值的函数2768.7指针数组和多重指针2798.7.1什么是指针数组 2798.7.2指向指针数据的指针2828.7.3指针数组作main函数的形参2848.8动态内存分配与指向它的指针变量2878.8.1什么是内存的动态分配2878.8.2怎样建立内存的动态分配2878.8.3void指针类型 2898.9有关指针的小结290习题293第9章用户自己建立数据类型2959.1定义和使用结构体变量2959.1.1自己建立结构体类型2959.1.2定义结构体类型变量 2979.1.3结构体变量的初始化和引用2999.2使用结构体数组3029.2.1定义结构体数组3029.2.2结构体数组的应用举例3049.3结构体指针3059.3.1指向结构体变量的指针3059.3.2指向结构体数组的指针3069.3.3用结构体变量和结构体变量的指针作函数参数3089.4用指针处理链表3119.4.1什么是链表 3119.4.2建立简单的静态链表3129.4.3建立动态链表3139.4.4输出链表3179.5共用体类型3199.5.1什么是共用体类型3199.5.2引用共用体变量的方式3209.5.3共用体类型数据的特点3219.6使用枚举类型3259.7用typedef声明新类型名328习题332第10章对文件的输入输出33310.1C文件的有关基本知识33310.1.1什么是文件33310.1.2文件名33410.1.3文件的分类33410.1.4文件缓冲区33510.1.5文件类型指针33510.2打开与关闭文件33710.2.1用fopen函数打开数据文件33710.2.2用fclose函数关闭数据文件33910.3顺序读写数据文件34010.3.1怎样向文件读写字符34010.3.2怎样向文件读写一个字符串34310.3.3用格式化的方式读写文件34610.3.4用二进制方式向文件读写一组数据34710.4随机读写数据文件35110.4.1文件位置标记及其定位35110.4.2随机读写 35410.5文件读写的出错检测355习题356第11章常见错误分析374附录390附录A在Visual C++ 6.0环境下运行C程序的方法390 附录CC语言中的关键字398附录D运算符和结合性398附录EC语言常用语法提要400附录FC库函数404参考文献410。
善于利用指针

他变量地址的变量称为指针变量。
内存单元的地址与内存单元的内容是有区别 :假设程序中已定义了2个整型变量i、j, 即 int i , j; 则编译时系统将 2000和2003这四个 字节的内存空间 分配给给变量i; 2004~2007这4个字
内存地址 内存单元内容 变量名
2000 2001 2002 2003 2004 2005 2006 2007
#include <stdio.h> 此处*与类型名在一起。此 int main() 时共同定义指针变量 { int a=100,b=10; int *pointer_1 , *pointer_2; pointer_1=&a; pointer_2=&b; printf(“a=%d,b=%d\n”,a,b); printf(“*pointer_1=%d,*pointer_2= %d\n”, *pointer_1, *pointer_2); return 0; 此处*与指针变量一起使 用。此时代表指针变量所 }
内存地址 内存单元内容 变量名 2000 00 i 00 2001 00 2002
2003 2004 2005 2006 2007 2008 2009 2010 2011
03 00 00 00 06 00 00 00 09 内存单元和地址
j
k
这种直接按变量名存取变量值的方式称 为‚直接访问‛方式 。
指针变量,分别指向这两个整型变量,通过
访问指针变量,可以找到它们所指向的变量 ,从而得到这些变量的值。
#include <stdio.h> int main() { int a=100,b=10; 定义两个指针变量 int *pointer_1, *pointer_2; 使pointer_1指向a pointer_1=&a; 使pointer_2指向b 直接输出变量a和b的值 pointer_2=&b; printf(“a=%d,b=%d\n”,a,b); 间接输出变 printf(“*pointer_1=%d,*pointer_2= 量a和b的值 %d\n”,*pointer_1,*pointer_2); return 0; }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
内存管理指针的基本概念指针应用实例指针作函数参数第8章指针(1)复习回顾上次课的内容:◆局部变量和全局变量◆变量的作用域◆变量的生存期◆声明与定义◆内部函数◆外部函数◆你开始习惯写函数了吗?2012是如何实现的?假定造成世界末日的上帝是一个程序员,作为一名合格的程序员,他绝不应该写出类似于“摧毁地球”这样的程序,而应该写一个“摧毁(行星)”的函数,然后把地球作为参数传进去!C语言新手的晋级之路第一步:萧规曹随◆在这一步要求按照教材或讲义上的程序实例进行原样输入,运行一下程序看是否正确。
◆在这一步,掌握C语言编程软件的使用方法(包括新建、打开、熟练输入、编辑、保存、关闭C程序);初步记忆新学章节的知识点;养成良好的编程风格(是讲义提倡的而不是教材上的)◆难点:小心数字1和字母l,字母o和数字0,中英文标点符号的区别C语言新手的晋级之路第二步:移花接木◆在第一步输入的C程序的基础上进行试验性的修改,运行一下程序看一看结果发生了什么变化,分析结果变化的原因,加深新学知识点的理解。
◆可与第一步同步进行,“输入”可加深记忆,“修改”可加深理解,二者相辅相成,互相促进。
◆友提,一次进行一处修改即可,免得把自己改晕了。
C语言新手的晋级之路第三步:无中生有◆面对教材的例子题目,不参考教材,自己从头开始编写程序。
看能否写出正确运行的代码。
◆初学者易犯的错误:scanf格式控制和输入不匹配或把变量名当地址作参数,使用未定义的变量、漏掉或多写“;”、“{”与“}”、“(”与“)”不匹配,控制语句(选择、分支、循环)的格式不正确,调用库函数没有包含相应头文件,调用未声明的函数、调用函数时实参和形参不匹配、数组边界越界等等◆要学会看编程工具的错误信息提示:双击错误提示光标可跳转到发生错误的行,如果该行没有错误就往前查找。
错误要一个一个修改,每改完一次编译一下程序。
C语言新手的晋级之路第四步:欲擒故纵◆教材最后一章列出C语言初学者易犯的错误,可以按照易出错的类型,将教材中正确的程序改成错误的程序,运行一下看看出现的错误信息提示,并记下。
再将程序改成正确的,运行一下。
这样反复修改,就能熟悉C语言程序发生错误的原因和修改错误的能力。
◆注意:每次只改错一个地方,目的是现实发生该错误的真正原因,要避免一次改动多个地方。
带一个记录本记下英文错误提示信息和解决该错误问题的方法,积累程序调试经验。
要善于利用调试工具。
C语言新手的晋级之路第五步:海纳百川◆经过上述过程,我们应该已经熟悉C语言各种语句的语法和流程。
现在可以研读别人编写的C语言经典程序,看懂别人是如何解决问题的,学习解决问题的方法和程序设计技巧,提高自己的程序设计能力。
◆源程序的来源●教材和讲义的例子●图书馆里的C语言参考书●网络上搜索各种源代码●……C语言新手的晋级之路 学习方法可以使你事半功倍但是,除此之外你还需要:◆相信自己有能力学好C语言◆足够的耐心◆足够的责任心◆足够的细心欢迎来到内存管理的雷区!内存的概念 从物理上讲内存就是一块半导体存储材料任何需要被计算机执行的程序,包括指令和数据都要先从外部存储器(包括硬盘光盘等)调入内存后才能被执行CPU需要精准地从内存中找到需要的数据参与运算◆CPU如何找到想要的数据?C 语言编译器眼里的内存随着以下C 语句的编译运行,编译器做了哪些事情,内存会发生什么变化?20002001200220032004200520060x87654321301符号表变量名地址数据类型i c f200020040x87654321int chardoublei cfint i;char c;double f;i = 3;0x876543220x876543230x876543240x876543250x876543260x876543270x87654328变量名和地址建立了对应关系内存的管理方法与地址20002001200220032004200520060x87654321301if0x876543220x876543230x876543240x876543250x876543260x876543270x87654328i 的地址sizeof(int)=4执行"i=3;"会发生什么?1.找到i 的地址2000;2.确定i 所占的字节2000~2003;3.往这四个字节写入整型数值3(32位)。
接下来,分析"f=i;"发生了什么 由此可见,访问变量必须知道其地址和类型!务必弄清楚存储单元的地址和存储单元的内容这两个概念的区别◆地址:存储单元的编号◆内容:存储单元里存放的值存储单元内容和地址的区别2000200120022003200420052006301i指针是什么“指针就是地址!”内存区的每一个字节有一个“地址”。
数据存放在地址所标识的内存单元中由于通过地址能找到所需的内存单元,我们可以说,地址指向该内存单元。
所以我们将地址形象化地称为“指针”怎样定义指针变量定义指针变量的一般形式为:类型* 指针变量名;如:int *p;◆int是为指针变量指定的“基类型”◆基类型指定指针变量可以指向的变量类型●如p 可以指向整型变量,但不能指向浮点型变量取地址操作符&声明一个变量时,编译器自动为变量开辟内存空间,我们无需关心变量在内存中的位置。
当程序需要用到某个变量的地址信息,就需要取地址符号&。
◆例如,int num=0; &num就是num变量的地址指针变量定义举例我们可以将变量地址赋值给同类型的指针int a, b;int *ip=&a, *iq=&b;float *fp;char *cp;ip=&b; 正确*ip=&b; 错误,注意此处的*前面没有数据类型!指针变量定义注意事项下列定义实现了怎样的功能?int * a, b, c;结果是:定义了一个指针变量a,两个整型变量b, c;如果想将a,b,c都定义成指针变量,需要:int *a,*b,*c;或int *a; int *b; int *c;图解指针变量301int i; //四个字节,32位0x123443210x876543210x876543220x876543230x87654324int *p = &i四个字节,32位0x123443210x123443220x123443230x123443240x123443250x123443260x12344327如有雷同纯属巧合定义指针变量必须指定其类型某类型指针变量只能存放该类型变量的地址int a, b;int *p1 = &a, *p2 = &b;float *p3;p3 =&a; 错误,float类型指针不能指向整型变量指针变量仅能存放变量的地址 将一个整数复制给指针变量是错误的变量的地址必须通过一个已经被分配了存储空间的变量加上取地址符“&”来获得,而不能直接指定一个具体的地址◆如int *a; a=0x5050; 错误◆但是可以用常量0给指针赋值,表示不指向任何变量的空指针变量,如a=0; 正确指针变量的初始化在声明一个指针后,若没有经过初始化,指针的值是不确定的,直接使用未加初始化的指针变量可能会给程序带来各种内存错误。
因此指针变量的初始化很重要。
如果一开始不知该将此指针指向何处,最简单的方式是利用NULL将指针置0◆如:int *pInt = NULL;指针变量的值在32位计算机系统中,所有类型的指针的值都是32位的整数。
“一个指针的值是A”◆即“该指针指向了以A为首地址的一片内存区域”“一个指针指向了某内存区域”◆即“该指针的值是这块内存区域的首地址”显示指针变量所占空间的实例1.#include <stdio.h>2.int main()3.{4.char* pChar;5.int* pInt;6.double* pDouble;7.//以下sizeof关键字可以用来计算括号内的变量占的字节数8.printf("pChar=%d\n",sizeof(pChar));9.printf("pInt=%d\n",sizeof(pInt));10.printf("pDouble=%d\n", sizeof(pDouble));11.return0;12.}和指针有关的运算符要熟练掌握两个有关的运算符:(1) &取地址运算符。
&a是变量a的地址(2) * 指针运算符(“间接访问”运算符)若有p=&a,则*p就等价于ak=*p; (表示把a的值赋给k)*p=1; (表示把1赋给a)指针运算符代码实例double num = 3;double* pNum;pNum = #pNum:指向double类型的指针变量,其值是num的地址&num:返回变量num的地址,与pNum等价*pNum:返回pNum所指的变量,与num等价&(*pNum):与&num(即pNum)等价*(&num):与*pNum(即num)等价(&*p)和(*&p)的区别“*”和“&”具有相同的优先级,按照从右向左的方向结合◆对于&*p而言:首先进行一次*p运算,再取地址,相当于&(*p),此情况p必须是一个指针变量!◆对于*&p:相当于*(&p),就是先取地址再做”*”运算,结果等价于p,此情况p可以是任何类型变量。
一粒牛肉干与指针运算符C语言上机课,某女同学边写代码边偷偷吃起牛肉干有一粒牛肉干掉到了键盘上,卡在7和8键之间……女同学左手搭在shift键上,右手就在键盘上抠啊、抠啊……于是程序里某一行代码变成这个样子:int*pa=&*&*&*&*&*&*&*&*&*&a;女同学没有注意,继续完成程序,结果呢……————程序顺利通过编译,运行结果完全正确!指针变量综合举例1.#include <stdio.h>2.int main()3.{4.unsigned int a = 5;5.unsigned int * pint = NULL;6.printf("&a = %p\n a = %d\n", &a, a);7.printf(" &pint=%p\n pint=%p\n &(*pint)=%p\n",8.&pint, pint, &(*pint));9.pint = &a;10.printf("\n&a=%p\n a=%d\n", &a, a);11.printf(" &pint=%p\n pint=%p\n &(*pint)=%p\n",12.&pint, pint, &(*pint));13.printf(" *pint=%d\n", *pint);14.*pint = 10;15.printf("&a=%p\n a=%d\n", &a, a);16.printf(" &pint=%p\n pint=%p\n &(*pint)=%p\n",17.&pint, pint, &(*pint));18.printf(" *pint=%d\n", *pint);19.return0;20.}不考虑指针,数据只能这样访问 直接访问方式◆通过符号表获得变量名i对应的地址直接进行访问符号表变量名地址数据类型i a[]k200020042008int int[2]int3122000200420083020变量i变量a[]变量kint i=3,k;int a[2]={1,2};k = i + a[1];从这里取3将5送到这里从这里取220125指针带来了新的数据访问方式 间接访问方式◆通过变量p的值获得其所指向的变量的地址,再通过这个地址进行访问符号表变量名地址类型i j k200020042008int int int3692000200420084016变量i变量j变量kint i=3,j=6,k,*p,*q; p = &i;q = &k;*q = (*p)+j;将k的地址存到这里将i的地址存到这里302020002008p q30204016int *int *变量p变量q直接/间接访问类比:酒店找人直接访问:例如“i=3;”◆跟i 很熟,知道它住哪儿,所以可以直接去访问它间接访问:例如已知p=&i; 执行“*p=3;”◆跟i 不熟,只知道i 住在酒店里,i 的房间号放在前台(即p )那里,所以先询问前台(通过p 获得i 的地址),然后去访问它i200032000p*p20003指针的优点能完成一些直接访问无法实现的功能突破屏障去操作计算机底层,提供更大的编程灵活度类比一下,在绕过某人(在某人不知情)的情况下获得某人的地址并进行操作◆权力机关才允许做的事情◆坏人容易利用来做些不可告人的勾当使用指针变量的例子通过指针变量访问整型变量。