2019最新第八章 指 针基本问题1为什么要使用指针 语言作为高级程序设计语言与其它高级程序设计语言的不
C++程序设计 第八章 指针和引用

第
在程序运行时变量和函数都存放在内存中,通过变量名来访问数据、通过函数名来调用函数都是直接访问方式。还有另一种间接访问方式就是用指针。指针的本质是内存地址。指针往往用于说明函数的形参,使实参能通过指针传递,以提高函数调用的效率。利用指针能动态地使用内存,以提高内存使用效率。指针也能用来表示数据关联,以构成复杂的数据结构。指针是C程序中最常见的类型。引用是C++扩展的新概念,主要用于函数形参和返回类型。本章将详细介绍指针和引用的概念及应用。
首先,这6个变量的地址是按递减次序排列,这是因为局部变量都存储在堆栈中,堆栈是先入后出的。先入栈的数据存放在较大地址位置,后入栈的数据存放在较小地址位置。如果这些变量改为全局变量,它们的排列次序就会颠倒过来。
其次,尽管变量s只占2字节,变量c只占1字节,但却分别占用4字节空间。这是因为按字对齐(32位数据)能提高CPU访问内存的效率,而且一次压栈和出栈操作也是以32位数据为单位,代价是浪费一些内存。如果这些变量改为全局变量,它们将按实际大小存储。
怎样能知道一个变量在运行时刻的内存地址?把取地址运算符&放在变量前面就得到它的首地址。例如b是一个变量,那么&b就表示它的地址。下面例子能看到一组局部变量的首地址。
例8-1显示一组局部变量的首地址。
#include<iostream.h>
void main(){
bool b = true;
char c = 'c';
其中,<类型名>是这个指针变量所指向的对象的类型,简称指针类型,它可以是任何一种类型。*表示这个变量是一个指针变量。这个变量的类型就是“<类型名>*”。<变量名>是一个标识符。指针变量可以进行初始化,等号之后给出一个变量的地址,要求这个变量的类型与指针类型相符。
指针进阶的知识点总结

指针进阶的知识点总结1. 指针的高级用法指针的高级用法包括指针的递增和递减、指针的比较、指针的运算等。
在C语言中,指针变量本质上就是一个存储内存地址的变量,因此可以进行递增和递减操作。
递增和递减的操作符分别是++和--,它们可以用来让指针指向下一个或上一个内存地址。
比较操作符可以用来比较两个指针变量的值,如果两个指针变量指向同一个内存地址,则它们相等,否则不相等。
指针变量也可以进行算术运算,比如加法、减法等操作,这些操作可以让指针指向任意偏移量的内存地址。
2. 指针和数组的关系在C语言中,数组和指针有着非常密切的关系。
在数组中,数组名就是一个指向数组首元素的指针常量,而数组元素可以通过下标来访问,其实就是通过指针进行的操作。
因此,可以将数组名当作指针来使用,可以通过指针的方式来访问数组元素。
另外,指针也可以用来实现数组的动态分配和释放,比如使用malloc函数来动态分配数组的内存空间,使用free函数来释放数组的内存空间。
3. 指针和函数的关系指针和函数也有着非常紧密的关系,在C语言中,指针可以作为函数的参数进行传递,也可以作为函数的返回值进行返回。
通过指针参数,可以实现对函数外部变量的访问和修改,可以实现对数组和字符串的传递和操作。
通过指针返回值,可以实现返回动态分配的内存空间,也可以实现返回多个数值结果。
另外,函数指针是一个非常重要的概念,它可以用来指向函数,可以作为参数进行传递和返回值进行返回,可以用来实现回调函数等功能。
4. 指针的类型转换在C语言中,指针的类型转换也是一个非常重要的操作。
指针的类型转换可以通过强制类型转换来实现,比如使用(void*)来将指针转换为void指针,使用(char*)来将指针转换为char指针等。
指针的类型转换可以用来实现对不同类型数据的访问和操作,比如将一个int指针转换为char指针,可以实现对int数据的逐字节访问。
但是需要注意的是,在进行指针类型转换时要格外小心,需要确保转换后的指针类型和实际内存中的数据类型一致,否则会出现未定义行为。
C语言技术的高级用法介绍

C语言技术的高级用法介绍C语言作为一门经典的编程语言,在计算机科学领域有着广泛的应用。
除了基础的语法和常见的用法外,C语言还有许多高级的技术和用法,可以提升程序的性能和功能。
本文将介绍一些C语言技术的高级用法,帮助读者更深入地了解和使用这门语言。
一、指针和引用指针是C语言中一个非常重要的概念,它可以用来直接访问和操作内存中的数据。
通过指针,我们可以实现更灵活的数据结构和算法。
同时,指针也可以用来提高程序的性能,例如通过指针传递参数可以避免数据的拷贝,减少内存的使用。
除了指针,C语言还支持引用的概念。
引用是指对一个变量的别名,通过引用可以方便地修改变量的值。
引用通常用于函数的返回值,可以避免使用指针传递参数时的繁琐操作。
二、动态内存分配动态内存分配是C语言中的一个重要技术,它可以在程序运行过程中动态地申请和释放内存。
通过动态内存分配,我们可以灵活地管理内存,提高程序的效率和可靠性。
C语言提供了几个函数来实现动态内存分配,例如malloc、calloc和realloc。
这些函数可以根据需要分配指定大小的内存,并返回指向该内存的指针。
在使用完毕后,我们需要调用free函数来释放这些内存,以避免内存泄漏。
三、位运算位运算是C语言中的一种高级技术,它可以对二进制数进行操作。
通过位运算,我们可以实现一些高效的算法和数据结构,例如位图、位集合和哈希表等。
C语言提供了一系列位运算的操作符,例如与、或、异或和取反等。
这些操作符可以用来进行位的与、或、异或和取反运算。
此外,C语言还提供了一些位运算的函数,例如位移和位计数等,可以方便地操作二进制数。
四、函数指针函数指针是C语言中的一个重要概念,它可以将函数作为参数传递给其他函数,或者将函数作为返回值返回。
通过函数指针,我们可以实现一些高级的编程技巧,例如回调函数和动态加载函数等。
在C语言中,函数指针的声明和使用需要遵循特定的语法规则。
我们可以通过typedef来定义函数指针类型,然后使用该类型来声明函数指针变量。
浅析C语言使用指针的必要性

o P:sp < +10 P+ +) f( r ; s 0; {
P 0:
}
以上 两个程序段 完成 的功能都 是一样 的 , 都是 让数组 s中的所有 元素 的值 均为 0 。程序 段 1中 , 每寻址 个数 组元素 都要进行 地址 的算术运算 , a i ( +i 。要 通 过数组 名加 上偏 移 量来实 现对 每个 数组 即 [3= a ) 元素 的访 问 。而程 序段 2只需 要通过指 针 的 自增运算来 实现对 数组元 素的访 问 。由于 自增运算 的执行效 率
3 9
较高 , 因此程 序段 2的执 行效 率要 比程 序段 1的高 。
1 2 利用指 针实现 对字 符 串的灵 活处 理 .
C语 言 中利用 字符数 组存 放字 符 串 , 以方便 地 使 用指 向字 符 的指 针 变量 操作 字符 串。通 过指 针 的移 可
动来实 现对 不 同位 置字 符 的访 问。如果 是 多个字 符 串还 可以通 过字符 型指 针数 组来 实现 对多个 字符 串的灵
每 个指针 数组 元素 对应 一个 字符 串 , 倘若 相对 多个 字符 串求 最大值 或者 进行 排序操 作 , 只需要 通过 改变 指针数 组 中个 元 素的指 向 , 就可 以实现 , 约 了大 量移 动数 据 的步骤 , 节 程序 的效 率得到 提高 。
1 3 利用 函数 指 针提高 程序 的效 率 .
率高 。
比如 :
程 序段 1 利用数 组下标 变化访 问 ) ( :
i ti n :
it 10 ; n [0 ] s
fri=0 o( ;i< 10 i +) 0; +
{
s i =0 [] ;
}
C语言入门教程-为什么要用指针?.

C语言入门教程-为什么要用指针?为什么要用指针?假设您想制作一个文本编辑器——一种用于编辑普通ASCII文本文件的程序,如UNIX上的“vi”或Windows上的“记事本”。
文本编辑器是很常用的软件,因为可想而知,它几乎是程序员使用最多的程序了。
通过文本编辑器程序员才能和计算机“亲密接触”——您使用它输入并实现自己的创意。
对于这么一个使用如此频繁又如此亲近的程序,您自然希望它是完美无缺的。
于是许多程序员自己制作文本编辑器并进行定制,以适合个人的工作方式和偏好。
现在您要制作自己的编辑器了。
考虑过所需的功能后,您开始思考编辑器使用的“数据结构”,即在内存中如何组织文件以供程序进行操作。
您需要的是一种便于对输入信息进行简单快捷操作的存储方式。
您确信将字符按行存储是一种可行的方法。
根据前面学到的知识,现在可用的只有数组。
您想:“一行一般是80个字符,一个文件一般不会超过1,000行。
”于是您声明了一个二维数组,像这样:char doc[1000][80];此声明要求分配的数组有1,000行,每行80个字符。
数组的规模是80,000个字符。
然而,当您对编辑器和它使用的数据结构进行了一些深入思考后,还会认识到下面三点:∙有些文档的内容是长长的列表。
每行很短,却有上千行。
∙有些特殊文本文件有很长的行。
比如有的数据文件可能包含长达542个字符的行,每个字符好像是代表DNA片段中的一个氨基酸。
∙大多数现代编辑器都允许同时打开多个文件。
假如您设定最多可以同时打开10个文件,每行最多1,000个字符,每个文件最多50,000行。
这时的声明就变成了:char doc[50000][1000][10];似乎看起来并不过分,可是您拿出计算器算一下50,000乘1,000乘10 就会发现数组包含了5亿个字符!如今的大多数计算机遇到这么大的数组的都会出问题。
它们根本没有足够的RAM甚至虚拟内存空间来容纳这么庞大数组。
即使是在最大的多用户系统上,如果多个用户要同时运行三四个这种编辑器程序的话,对系统也会造成严重的负担。
浅谈C语言中指针的概念及基本应用规律

( 1 ) 定义指针后, 必须将其初始 化。 可以用做给指针变 量初
始化 的有变量 的地 址, 另一个指针变量 , 数 组名 , 函数名等 。 需
语句不起作用。 此时, s t r 手 旨 向的存储区里是什么? 我们不知道。
要注意的是动态 内存分配 时, 使用之前将其初始化为N U L L 。 指针在 定义之后, 如果没有 明确 赋值, 那么和其他 变量类 似, 其 内部 的地 址值 是随机 的。 此时指针指 向的空 间中的数据 意义是不可预 测的, 一般 成为野指针。 我们知道在c 语言 中, 指
r e e 或d e l e t e 释放该 内存块 , 否则 , 这块 内存 就不能被 量也必 须为指针, 且 应与返 回值的类 型相同。 指针变 量可 以指 的调用f 再 次使用 , 我们就 说这块 内存泄漏 了。 使 用指针 时, 在赋值 等 向整型变量、 字符 串变 量、 也可以指 向函数 的入 口地址和指针为
函数调用结束后系统会 自动收回 内存 。 的不 同是, 指针数组在指 针的数量 上有所 改变 , 它 由一 个指针 分配局部动态 变量等 , 全局数据 区存放的是静态和全局变量 , 随着程 序的消亡而 自动 演 变到一组同类 指针。
一般 我们 常说的内存 泄漏是指堆 内存 的泄 漏。 堆 ( 2 ) 指针 函数与函数 指针。 指 针函数 是 返回值 为指 针 的函 收收 回内存。 大小任 意的( 内存块的大小可以 数, 指针 函数 打破 了其它高级 语言中的指针、 数组不能作为返 内存 是指 程序从堆 区中分配的,
写程序还是有很大帮助的。 笔者从几个方面来剖析指针 的本质, 并着重围绕指针的一个重要应用一一动态分配内存来谈谈如何回避常见错
C语言中的指针技术
C语言中的指针技术指针技术是C语言中非常重要的概念和特性之一,它允许程序员直接访问内存地址和操作内存中的数据。
指针实际上是一个变量,存储的是另一个变量的地址。
通过指针,程序员可以更高效地管理内存,提高代码的性能和灵活性。
首先,指针提供了直接访问内存地址的能力,这意味着可以在程序中直接操作变量在内存中的位置,而无需通过变量名来访问。
通过指针,可以实现数据的传递和共享,避免在函数调用和数据传递过程中产生额外的开销。
此外,指针还可以实现动态内存分配,程序员可以根据需要在运行时分配和释放内存,更灵活地管理内存空间。
其次,指针可以用来实现数据结构中的链表、树等复杂数据结构。
通过指针的相互引用,可以构建各种复杂的数据结构,实现高效的数据操作和算法。
指针还可以用来实现数据的动态结构,比如链表的插入和删除操作。
指针技术在数据结构和算法中起着至关重要的作用,是程序员必备的技能之一。
另外,指针还可以用来操作数组。
数组名本身就是一个指针常量,指向数组的第一个元素的地址。
通过指针算术运算,可以访问数组中的任意一个元素,实现对数组的灵活操作。
指针还可以用来实现字符串操作,C语言中的字符串本质上是一个字符数组,通过指针可以方便地对字符串进行操作和处理。
除了上述应用,指针还可以用来实现函数指针。
函数指针是指向函数的指针变量,可以将函数作为参数传递给其他函数,实现函数回调和动态调用。
函数指针在一些高级应用中非常有用,比如回调函数、事件处理等。
总的来说,指针技术是C语言中非常重要的概念,掌握指针技术可以帮助程序员更高效地管理内存、实现复杂的数据结构和算法、操作数组和字符串、实现函数回调等功能。
对于想要提升C语言编程水平的程序员来说,深入理解和掌握指针技术是必不可少的。
通过实践和不断学习,可以逐渐掌握指针技术,并运用到实际的编程项目中。
C语言技术的高级用法——进阶开发技巧详解
C语言技术的高级用法——进阶开发技巧详解C语言作为一门广泛应用于嵌入式系统和底层软件开发的编程语言,其高级用法和进阶开发技巧对于程序员来说至关重要。
本文将详细介绍一些C语言的高级用法和进阶开发技巧,帮助读者更好地掌握和应用C语言。
一、指针的高级应用指针是C语言中的重要概念,利用指针可以实现更高效的内存管理和数据操作。
以下是一些常见的指针高级应用:1. 指针的指针指针的指针是指一个指针变量指向另一个指针变量的地址。
通过使用指针的指针,可以实现对指针变量的动态修改和访问,进一步提高程序的灵活性。
2. 函数指针函数指针可以指向程序中的函数,通过函数指针可以实现对函数的动态调用和替代。
这在实现回调函数和函数式编程时非常有用。
3. 指针与数组指针和数组之间有着密切的关系,可以通过指针来遍历和操作数组元素,这样可以减少内存的占用和提高程序的运行效率。
二、内存管理与优化技巧C语言需要手动管理内存,合理地进行内存管理和优化可以提高程序的性能和稳定性。
以下是一些常用的内存管理和优化技巧:1. 内存分配和释放C语言提供了malloc()和free()函数用于动态分配和释放内存。
合理使用这些函数可以减少内存的浪费和泄漏。
2. 内存对齐内存对齐可以提高内存访问的效率,尤其对于嵌入式系统来说更为重要。
通过使用内存对齐的技巧,可以减少内存读取的时间,提高程序的运行效率。
3. 缓存优化程序中的缓存访问对于性能有着重要影响。
通过充分利用缓存的特性,如空间局部性和时间局部性,可以减少缓存的命中不中和提高程序的效率。
三、并发编程与多线程随着多核处理器的普及,多线程编程成为了提高程序性能的重要方式。
C语言提供了一些库和技术用于并发编程和多线程的实现。
1. 线程创建与管理C语言的线程库提供了线程的创建和管理方法,可以创建多个线程来执行不同的任务,提高程序的并行性。
2. 互斥与同步多线程访问共享资源时需要进行同步和互斥操作以避免竞态条件的发生。
C语言的指针高级技巧
C语言的指针高级技巧在C语言中,指针是一种强大且常见的数据类型。
它们允许我们对内存地址进行直接访问和操作,从而能够实现一些高级的编程技巧。
本文将介绍一些C语言中常用的指针高级技巧,帮助你更好地理解和利用指针。
1. 指针和数组1.1 指针与数组的关系在C语言中,指针和数组有着紧密的关系。
事实上,数组名本身就是一个指向数组首元素的指针。
我们可以使用指针来访问数组中的元素,也可以通过指针来修改数组中的值。
1.2 指针和二维数组除了一维数组,指针也可以用来处理二维数组。
对于二维数组,可以使用指针数组或者指向指针的指针来表示。
这种技巧在处理矩阵等数据结构时非常有用。
2. 指针和函数2.1 函数指针在C语言中,函数名也是一个指针,指向函数代码的起始地址。
我们可以使用函数指针来传递函数作为参数,或者将函数指针作为返回值。
2.2 回调函数回调函数是一种常见的应用模式,在事件驱动的编程中特别常见。
它允许我们在特定事件发生时调用指定的函数。
3. 动态内存管理3.1 malloc()和free()在C语言中,我们可以使用malloc()函数来动态分配内存。
动态内存分配可以使程序更加灵活,但也需要注意避免内存泄漏和野指针等问题。
3.2 realloc()函数realloc()函数允许我们重新调整已分配内存的大小。
这在动态数据结构的实现中非常有用,可以减少内存使用量。
4. 指针与结构体4.1 结构体指针指针和结构体的组合使得我们可以方便地对结构体的成员进行访问和修改。
使用指针来操作结构体可以提高程序的效率。
4.2 动态结构体通过结构体指针和动态内存分配,我们可以实现动态结构体的创建和销毁。
这对于管理复杂的数据结构非常有用。
5. 指针运算5.1 指针的加法和减法使用指针的加法和减法可以方便地移动指针位置。
注意在进行指针运算时,要确保不超出合法的内存范围。
5.2 指针的比较指针之间可以进行比较运算,例如判断两个指针是否相等或者大小关系。
c语言使用指针的基本原则
c语言使用指针的基本原则
1. 指针的定义和声明:使用 * 来定义指针变量,指针的类型必须和指向的变量类型相匹配。
2. 取址操作:使用 & 运算符来获取一个变量的地址。
3. 解引用操作:使用 * 运算符来访问指针所指向的变量的值。
4. 指针的初始化:指针变量在定义时不被初始化,可以通过将其赋值为 NULL 或者一个有效
的地址来进行初始化。
5. 空指针检查:在对指针进行操作之前,应该先检查其是否为空指针,以避免出现错误。
6. 指针的指向:指针变量可以指向一个变量的地址,也可以指向另一个指针变量的地址。
7. 动态内存分配:可以使用 malloc() 函数来在运行时动态地分配内存空间,并使用 free() 函数
释放已分配的内存空间。
8. 指针运算:可以使用指针进行算术运算,比如指针加法、指针减法等。
同时,指针还可以用
于数组的访问。
9. 指针作为函数参数:可以将指针作为函数的参数传递,从而在函数内部修改指针所指向的变
量的值,实现数据的传递和共享。
10. 指针和数组:指针可以用来遍历数组,通过指针访问数组元素可以提高效率。
同时,数组
名本身也可以看作是一个指向该数组第一个元素的指针。
这些是 C 语言使用指针的一些基本原则,掌握了这些原则可以更加灵活和高效地使用指针来
进行编程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(1)程序中可以用变量来存放各种数据,因此每个变 量都需要分配连续的字节。
(2)由于数据类型的不同,每个变量需要分配的字节 数目也不同。
(3)对源程序进行编译时,每遇到一个变量,就给它 分配内存单元,同时在“变量与地址对照表”中记录 变量的名称、数据类型和地址。
例如:在程序清单中有下列数据定义语句: char ch='A';short s=5;float f;
(3)定义成某种数据类型的指针变量,只能用来指向 同种数据类型的变量或数组。
(4)给指针变量赋的“初值”必须是地址值,可以是
“&变量名”、“&数组元素”、“数组名”。这里的 变量或数组必须事先已定义过。
例如:int a; int *p=&a; /*指针变量p指向了变量a*/ float f1,f[5],*p1=&f1,*p2=f,*p3=&f[2];
2.用指向一维数组的指针变量处理数组元素
用指针变量处理一维数组元素的关键是引用数组元 素,用指针变量引用数组元素的方法如下:
*(指针变量+i)
说明:(1)其中i是要引用的数组元素的下标,(指针 变量+i)是该元素的地址, *(指针变量+i)就是要引 用的数组元素。
(2)当指针变量指向一维数组后,对下标为i的数组元 素引用可有下列四种方式:
3000
a[2]
(4)一个数组的首地址,就是第一个元素(即下标为0 的数组元素)的地址。
(5)如果知道数组a的首地址和数据类型,可以通过下 列公式计算出每个数组元素的地址,从而找到每个数 组元素。
数组元素a[i]的地址=数组首地址+i*数据类型所占的 字节数
8.1 指针变量
1.什么是指针变量 指针所表示的地址如果要存放,也必须要存放在
a[2]
2 a[2][0] a[2][1] a[2][2] a[2][3]
其中a是二维数组名,a[0]、a[1]、a[2]是每一 个一维数组的数组名。
指针变量的关系运算举例
short a[10],*p1=&a[2],*p2=&a[3];
p1<p2
结果为1
p1++==p2 结果为0
--p2==p1 结果为1
p1<a
结果为0
p1<&a[9] 结果为1
p2<=a+3 结果为1
4. 指向一维数组的指针变量的应用举例
例4:输入10个整数存入一维数组,从中查找某个整 数(该数从键盘上读取),若查到,则输出它是10个 整数中的第几个数(序号规定从1开始);查不到则 输出“Not Find!”。要求用指针变量处理数组元素。
for (p=a;p<a+10;p++) scanf("%d",p);
scanf("%d",&x); for (n=1,p=a;p<a+10;p++,n++)
if (*p==x){flag=1;break;} if (flag)
printf("%d\n",n); else
printf("Not Find\n"); }
2.举例说明
例1:指针变量引用举例。 假设有如下的定义语句,则列表给出了几个指针引 用的表达式及其含义。
int a[6]={3,7,11,13,17,19},b,*p,*q;
表达式
含义
p=a b=*p+1
p++ q=p p=NULL
使p指向a数组的首元素a[0] 将表达式a[0]+1的值赋予变量b 使指针p后移一个存储单元,指向a[1]
例如:int a,b[5],*p=&a,*p1=b;
a=10;
*p=10;
等价
*&a=10;
b[0]=5;
*p1=5;
等价
*&b[0]=5;
8.2 指针变量的使用
一、指向变量的指针变量的使用
1.使用说明:
(1)如果要使用指针变量指向某个变量时,首先要定 义变量和同类型的指针变量; (2)将变量的地址赋值给指针变量,则指针变量就可 以指向该变量; (3)当指针变量一旦指向了某个变量后,就可以利用 指针变量来使用该变量。
则分配的内存单元如图所示,“变量与地址对照表” 如表所示。
地址 内存单元
2000
A…2010 2015…3000
3001 3002
70.0
3003
字符变量ch 短整型变量s
单精度变量f
变量与地址对照表
变量名
数据类型
变量地址
ch
字符型
2000
s
短整型
2010
f
单精度实型
3000
假设有赋值语句:f=ch+s;
++指针变量 --指针变量 指针变量++
“指针变量中的地址+指针变量类型占用字 节数”对应的地址,此后,指针变量将指向 后一个数组元素 “指针变量中的地址-指针变量类型占用字 节数”对应的地址,此后,指针变量将指向 前一个数组元素
“指针变量中的地址”对应的地址 此后,指针变量将指向后一个数组元素
指针变量--
变量中,而存放地址值的变量就是指针变量。
一、指针变量的定义和初始化
1.定义格式:数据类型符 *指针变量名[=初值]; 2.功能:定义指向“数据类型”的变量或数组的指针 变量,同时给其赋初值。 3.说明: (1)指针变量名的构成规则是标识符,前面必须有*号。
(2)数据类型可以选取任何基本数据类型,也可以用 以后要介绍的其他数据类型。但需要注意的是:定义 指针变量的数据类型不是指针变量中存放的数据类型, 而是它将要指向的变量或数组的数据类型。
用指针变量处理: void main() { int a,b,c,*pa=&a,*pb=&b,*pc=&c,*p;
scanf("%d,%d,%d",pa,pb,pc); if (*pa>*pb)p=pa,pa=pb,pb=p; if (*pa>*pc)p=pa,pa=pc,pc=p; if (*pb>*pc)p=pb,pb=pc,pc=p; printf("%d<=%d<=%d\n",*pa,*pb,*pc); }
使q也指向a[1] 使p不指向任何对象
例2:阅读下列程序看输出结果 #include <stdio.h> void main() { int j=28,k,*p=&j;
char c1,c2='f',*q; k=*p*2-3; q=&c1; *q=c2+1; printf("k=%d\nc1=\'%c\'\n",k,*q); }
例3:输入3个整数,按从小到大的顺序输出。 要求用指针变量处理。
先考虑不用指针变量编程:
void main() { int a,b,c,t;
scanf("%d,%d,%d",&a,&b,&c); if (a>b)t=a,a=b,b=t; if (a>c)t=a,a=c,c=t; if (b>c)t=b,b=c,c=t; printf("%d<=%d<=%d\n",a,b,c); }
4.数组与内存单元地址的关系
(1)对一个数组来说,所分配的内存单元必须是连续 的。每个数组元素占用连续的内存单元。
(2)一个数组占用的总字节数等于数组长度×每个数 组元素占用的字节数。
(3)对源程序进行编译时,每遇到一个数组,就给它 分配内存单元,同时在“数组与地址对照表”中记录 数组名、数据类型、数组长度和数组首地址。
2002 2003
2004 2005
2006 2007
2008 2009
(2)指针变量和指针变量的减法运算 运算规则:指针变量1-指针变量2 说明: ①运算结果为它们所指向的数组元素下标相差的整数 ②要求这两个指针变量必须指向同一个数组,否则不 能进行减法运算。 例如:int a[10],*p1,*p2;
*(指针变量+i) 或 *(数组名+i)(称为指针法)
指针变量[i] 或 数组名[i] (称为下标法)
3. 指向一维数组的指针变量的运算
(1)指针变量和整数的算术运算
运算类型 指针变量+整数
运算规则
“指针变量中的地址+整数*指针变量类 型占用字节数”对应的地址
“指针变量中的地址-整数*指针变量类
指针变量-整数 型占用字节数”对应的地址
p
a变量
f数组
p2
f[0]
p1
f1变量
f[1]
f[2]
p3
f[3]
int a;
f[4]
float *p=&a; /*错误的*/
二、取地址运算符和指针运算符
1.运算符
名
称 运算符
对象数 与位置
运算规则
取地址 &
取运算对象的
单目前缀
地址 获得运算对象
指针 *
对应的变量或 数组元素
对象类型
变量、数组元 素 地址(指针变 量、变量或数 组元素地址)
2 a[2][0] a[2][1] a[2][2] a[2][3]
结构之二:把二维数组a的每一行看成是一个一维数
组,即二维数组由多个一维数组组成,其结构如图所
示:
0
1
2
3
a
a[0]
0 a[0][0] a[0][1] a[0][2] a[0][3]