C语言程序设计教程-第8节(新)[1].ppt_第1页
C语言程序设计教程-第8节(新)[1].ppt_第2页
C语言程序设计教程-第8节(新)[1].ppt_第3页
C语言程序设计教程-第8节(新)[1].ppt_第4页
C语言程序设计教程-第8节(新)[1].ppt_第5页
免费预览已结束,剩余69页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

8 1指针与指针变量8 2指针与函数8 3指针与数组8 4指针与字符串8 5指针数组与命令行参数8 6程序举例 第8章指针 C语言程序设计教程 计算机教学中心 李勇C语言程序设计教程 2 8 1指针与指针变量 8 1 1指针的概念1 内存与变量地址内存地址 内存是计算机用于存储数据的存储器 以一个字节作为存储单元 为了便于访问 给每个字节单元一个唯一的编号 第一字节单元编号为0 以后各单元按顺序连续编号 这些单元编号称为内存单元的地址 变量地址 变量所分配存储空间的首字节单元地址 字节单元编号 计算机教学中心 李勇C语言程序设计教程 3 2 变量的三要素 名字 类型与值每个变量都通过变量名与相应的存储单元相连系 具体分配哪些单元给变量 由 编译系统完成变量名到对应内存单元地址的变换 变量分配存储空间的大小由类型决定 变量的值则是指相应存储单元的内容 3 内存存取方式直接存取 把直接按变量名或地址存取变量值的方式称为 直接存取 方式 间接存取 通过定义一种特殊的变量专门存放内存或变量的地址 然后根据该地址值再去访问相应的存储单元 计算机教学中心 李勇C语言程序设计教程 4 系统为特殊变量p 用来存放地址的 分配的存储空间地址是4800 p中保存的是变量a的地址 即4000 当要读取a变量的值12345时 不是直接通过a变量 也不是直接通过保存12345的内存单元的地址4000去取值 而是先通过变量p得到p的值4000 即a的地址 再根据地址4000读取它所指向单元的值12345 这种间接的通过变量p得到变量a的地址 再存取变量a的值的方式即为 间接存取 通常称变量p指向变量a 变量a是变量p所指向的对象 计算机教学中心 李勇C语言程序设计教程 5 4 指针的概念 在 语言中 用指针来表示一个变量指向另一个变量这样的指向关系 所谓指针即地址 一个变量的指针即该变量的地址 如4000就是指向变量a的指针 指针变量 专门存放地址的变量 如p即是一个指针变量 它存放的是a的地址4000 计算机教学中心 李勇C语言程序设计教程 6 8 1 2指针变量的定义与初始化1 指针变量的定义类型标识符 指针变量名 例 float p1 定义p1为指向实型变量的指针变量 char p2 定义p2为指向字符型变量的指针变量 在指针变量定义中 是一个说明符 它表明其后的变量是指针变量 如p是指针变量 而不要认为 p 是指针变量 指针变量定义时指定的数据类型不是指针变量本身 变量存放的值 的数据类型 而是指针变量所指向的对象 或称目标 的数据类型指针变量存放的是所指向的某个变量的地址值 而普通变量保存的是该变量本身的值指针变量并不固定指向一个变量 可指向同类型的不同变量 计算机教学中心 李勇C语言程序设计教程 7 1 指针运算符与地址运算符与指针引用有关的两个运算符 与 取地址运算符 指针运算符 或称指向运算符 间接访问运算符 指针指向的对象的表示形式 指针变量此处 是访问指针所指对象的运算符 与指针定义时的 不同 2 指针变量初始化 计算机教学中心 李勇C语言程序设计教程 8 2 指针变量初始化 若有定义 inta p 语句仅仅定义了指针变量p 但指针变量并未指向确定的变量 或内存单元 因为这些指针变量还没有赋给确定的地址值 只有将某一具体变量的地址赋给指针变量之后 指针变量才指向确定的变量 内存单元 指针变量初始化 在定义指针时同时给指针一个初始值如 inta p 计算机教学中心 李勇C语言程序设计教程 9 3 指针变量的引用 指针变量名 代表所指变量的值 指针变量名 代表所指变量的地址 有定义 inta p 注意 与 具有相同的优先级 结合方向从右到左 这样 p即 p 是对变量 p取地址 它与 a等价 p与 p 等价 a与 a 等价 计算机教学中心 李勇C语言程序设计教程 10 8 1 3指针运算 1 指针的赋值运算 1 将变量地址值赋给指针变量 使指针指向该变量 设有如下定义 inta b pa pb float pf 第一行定义了整型变量a b及指针变量pa pb pa pb还没有被赋值 因此pa pb没有指向任何变量 下面语句完成对pa pb的赋值 pa 计算机教学中心 李勇C语言程序设计教程 11 例如 intj 2 k 5 int pointer1 pointer2 pointer1 计算机教学中心 李勇C语言程序设计教程 12 2 相同类型的指针变量间的赋值 pa与pb都是整型指针变量 它们间可以相互赋值 如 pb pa 即pa pb都指向变量a 此时a pa pb是等价的 指针指向变化如下图 注意 只有相同类型的指针变量才能相互赋值 如pf pa 是不允许的 因为pa是整型指针 pf是浮点型指针 计算机教学中心 李勇C语言程序设计教程 13 给指针变量赋空值 给指针变量赋空值 说明该指针不指向任何变量 空 指针值用NULL表示 NULL是在头文件stdio h中预定义的常量 其值为 在使用时应加上预定义行 如 include stdio h int pa NULL 亦可以用下面的语句给指针赋 空值 pa 0 或 pa 0 这里指针pa并非指向0地址单元 而是具有一个确定的 空值 表示pa不指向任何变量 注意 指针虽然可以赋值0 但却不能把其它的常量地址赋给指针 例如 pa 4000 是非法的 计算机教学中心 李勇C语言程序设计教程 14 例8 1指针定义与初始化 main inta b int pointer 1 pointer 2 a 100 b 10 pointer 1 计算机教学中心 李勇C语言程序设计教程 15 程序运行结果 100 10100 10 计算机教学中心 李勇C语言程序设计教程 16 例8 2从键盘上输入两个整数到a b 按由大到小输出 includemain inta b pa pa指向大数 pb指向小数 计算机教学中心 李勇C语言程序设计教程 17 若输入 1222 输出结果 a 12 b 22max 22 min 12 b c 指针变化示意图 计算机教学中心 李勇C语言程序设计教程 18 2 指针的算术运算 1 加减运算 一个指针可以加 减一个整数n 其结果与指针所指对象的数据类型有关 指针变量的值应增加或减少 n sizeof 指针类型 加减运算常用于数组的处理 对指向一般数据的指针 加减运算无实际意义 例如 inta 10 p a x x p 3 实际上是p加上3 2个字节赋给x x指向数组的第四个分量 对于不同基类型的指针 指针变量 加上 或 减去 一个整数n所移动的字节数是不同的 例如 floata 10 p a x p p 3 实际上是p加上3 4个字节赋给x x依然指向数组的第四个分量 计算机教学中心 李勇C语言程序设计教程 19 2 自增自减运算 指针变量自增 自减运算具有上述运算的特点 但有前置后置 先用后用的考虑 务请小心 例如 inta 10 p a x x p x指向第一个元素分量 p指向第二个元素 x p x p均指向数组的第二个分量 p 相当于 p p 与 p 含义不同 前者表示地址自增 后者表示当前所指向的数据自增 计算机教学中心 李勇C语言程序设计教程 20 2 a的含意是什么 答 a或 p 3 p 相当于什么 答 a 思考 1 若有定义inta p 执行了 p a 则 p 的含意是什么 答 相当于 a 计算机教学中心 李勇C语言程序设计教程 21 3 指针的关系运算 与基本类型变量一样 指针可以进行关系运算 在关系表达式中允许对两个指针进行所有的关系运算 若p q是两个同类型的指针变量 则 p q p q都是允许的 指针的关系运算在指向数组的指针中广泛的运用 假设p q是指向同一数组的两个指针 执行p q的运算 其含义为 若表达式结果为真 非 值 则说明p所指元素在q所指元素之后 或者说q所指元素离数组第一个元素更近些 注意 在指针进行关系运算之前 指针必须指向确定的变量或存储区域 即指针有初始值 另外 只有相同类型的指针才能进行比较 计算机教学中心 李勇C语言程序设计教程 22 8 1 4多级指针 把指向指针型数据的指针变量称为指向指针的指针 或称多级指针 二级指针的定义形式如下 数据类型 指针变量例如 inta p pp a 22 p 思考 如何用pp得到a的值 假设变量a的地址为4000 指针p的地址为4100 二级指针pp的地址为4800 a p pp三者的关系如上图 pp 4800 p 4100 a 4000 计算机教学中心 李勇C语言程序设计教程 23 8 2指针与函数 8 2 1指针作为函数参数利用指针作函数参数 可以实现函数之间多个数据的传递 当形参为指针变量时 其对应实参可以是指针变量或存储单元地址 函数形参为指针变量 用指针变量或变量地址作实参例8 3编写一个交换两个变量的函数 在主程序中调用 实现两个变量值的交换 计算机教学中心 李勇C语言程序设计教程 24 程序如下 includevoidswap int p1 int p2 函数声明 main inta b int pa pb scanf d d 或 swap 计算机教学中心 李勇C语言程序设计教程 25 接上页 voidswap int p1 int p2 inttemp temp p1 交换指针p1 p2所指向的变量的值 p1 p2 p2 temp 程序运行结果如下 输入 1222 输出 a 22 b 12 计算机教学中心 李勇C语言程序设计教程 26 两点说明 1 若在函数体中交换指针变量的值 实参a b的值并不改变 指针参数亦是传值 例如 int p p p1 p1 p2 p2 p 不要希望如此完成a b值的交换 2 函数中交换值时不能使用无初值的指针变量作临时变量 例如 int p p p1 p1 p2 p2 p p无确定值 对p的使用可能带来不可预期的后果 计算机教学中心 李勇C语言程序设计教程 27 8 2 2指针函数 指针函数 是指返回值为指针的函数指针函数的定义形式 类型标识符 函数名 参数 例如 int fun inta intb 函数体语句 在函数体中有返回指针或地址的语句 形如 return 并且返回值的类型要与函数类型一致 计算机教学中心 李勇C语言程序设计教程 28 例8 3分析如下程序 main inta b p int max intx inty scanf d d int max intx inty ifx y return 计算机教学中心 李勇C语言程序设计教程 29 8 2 3指向函数的指针 一个函数包括一组指令序列 存储在某一段内存中 这段内存空间的起始地址称为函数的入口地址称函数入口地址为函数的指针 函数名代表函数的入口地址可以定义一个指针变量 其值等于该函数的入口地址 指向这个函数 这样通过这个指针变量也能调用这个函数 这种指针变量称为指向函数的指针变量 定义指向函数的指针变量的一般形式为 类型标识符 指针变量名 例如 int p 指针变量p可以指向一个整型函数 float q 指针变量q可以指向一个浮点型函数 计算机教学中心 李勇C语言程序设计教程 30 刚定义的指向函数的指针变量 亦象其它指针变量一样要赋以地址值才能引用 当将某个函数的入口地址赋给指向函数的指针变量 就可用该指针变量来调用所指向的函数给函数指针赋初值 将函数名 函数的入口地址值 赋给指针变量例如intm p intmax inta intb 则可以p max p指向函数max 指针调用函数的一般形式为 指针变量 实参表 如上例 m p 12 22 比较m max 12 22 计算机教学中心 李勇C语言程序设计教程 31 注意 用函数指针调用函数是间接调用 没有参数类型说明 C编译系统也无法进行类型检查 因此 在使用这种形式调用函数时要特别小心 实参一定要和指针所指函数的形参类型一致 函数指针可以作为函数参数 此时 当函数指针每次指向不同的函数时 可执行不同的函数来完成不同的功能例8 4函数max 用来求一维数组的元素的最大值 在主调函数中用函数名调用该函数与用函数指针调用该函数来实现 计算机教学中心 李勇C语言程序设计教程 32 程序如下 include stdio h defineM8main floatsumf sump floata M 11 2 3 4 5 5 69 7 80 float p 定义指向函数的指针p floatmax floata intn 函数声明 p max 函数名 函数入口地址 赋给指针p sump p a M 用指针方式调用函数 sumf max a M 用函数名调用max 函数 printf sump 2f n sump printf sumf 2f n sumf 计算机教学中心 李勇C语言程序设计教程 33 程序接上页 floatmax floata intn intk floats s a 0 for k 0 k n k if s a k s a k returns 程序运行结果 sump 80 00sumf 80 00 计算机教学中心 李勇C语言程序设计教程 34 指向函数的指针的使用步骤 1 定义一个指向函数的指针变量 形如 float p 2 为函数指针赋值 格式如下 p 函数名 注意 赋值时只需给出函数名 不要带参数 3 通过函数指针调用函数 调用格式如下 s p 实参 计算机教学中心 李勇C语言程序设计教程 35 8 3指针与数组 8 3 1指向一维数组的指针数组名是一个常量指针 它的值为该数组的首地址1 指向数组的指针的定义方法与指向基本类型变量的指针的定义方法相同 例如 inta 10 1 3 5 7 9 int p p 把数组的首地址赋给指针变量p 计算机教学中心 李勇C语言程序设计教程 36 C语言规定 数组名代表数组首地址 是一个地址常量 因此 下面两个语句等价 p 两句 计算机教学中心 李勇C语言程序设计教程 37 指向数组的指针变量p a 0 p 1或a 1 p 9或a 9 a 9 或 p 9 计算机教学中心 李勇C语言程序设计教程 38 2 通过指针引用数组元素 p 5 表示对p当前所指的数组元素赋以一个值5 C规定 p 1指向数组的下一元素 而不是将p值简单地加1 p 1意味着使p的原值 地址 加d个字节 d为一个数组元素所占的字节数 如果p的初值为 a 0 则 1 p i和a i就是a i 的地址 或者说它们指向a数组的第i个元素 见下页图 2 p i 或 a i 是p i或a i所指向的数组元素 即a i 3 指向数组的指针变量也可以带下标 如p i 与 p i a i 等价 计算机教学中心 李勇C语言程序设计教程 39 综上所述 引用一个数组元素有二法 1 下标法 如a i p i 形式 2 指针法 如 a i 或 p i 其中a是数组名 p是指向数组的指针变量 其初值p a 计算机教学中心 李勇C语言程序设计教程 40 main inta 10 inti for i 0 i 10 i scanf d 例8 5用三种方法输出数组全部元素 1 下标法 计算机教学中心 李勇C语言程序设计教程 41 main inta 10 inti for i 0 i 10 i scanf d 2 通过数组名计算数组元素地址 输出元素的值 计算机教学中心 李勇C语言程序设计教程 42 3 用指针变量指向数组元素main inta 10 int p i for i 0 i 10 i scanf d 三种方法的比较 用下标法比较直观 能直接知道是第几个元素 而用指针法则执行效率更高 计算机教学中心 李勇C语言程序设计教程 43 使用指针变量时 应注意 1 指针变量可实现使本身的值改变 P 合法 但a 不合法 a是数组名 代表数组首地址 在程序运行中是固定不变的 2 要注意指针变量的当前值 计算机教学中心 李勇C语言程序设计教程 44 3 p 相当于 p 因为 与 优先级相同 且结合方向从右向左 其作用是先获得p指向变量的值 然后执行p p 1 4 p 与 p 意义不同 后者是先p p 1 再获得p指向的变量值 若p a 则输出 p 是先输出a 0 再让p指向a 输出 p 是先使p指向a 再输出p所指的a 5 p 表示的是将p指向的变量值 计算机教学中心 李勇C语言程序设计教程 45 小结 1 如何使得一个指针指向一个数组 1 利用数组首元素的地址 2 利用数组名 2 如何引用一个数组元素的值 1 下标法 a 利用数组名加下标 b 利用指针变量名加下标 2 指针法 a 利用对数组名的间接访问 b 利用对指针变量的间接访问 计算机教学中心 李勇C语言程序设计教程 46 8 3 2二维数组与多维数组的指针表示法 1 二维数组的地址设有一个二维数组a 它有三行四列 inta 3 4 数组名a 代表整个二维数组的首地址 也就是第0行的首地址 a i 代表第i行的首地址 见下页图 计算机教学中心 李勇C语言程序设计教程 47 数组名a代表整个二维数组的首地址 上图a数组包含三个元素 a 0 a 1 a 2 而每个元素又是一个一维数组 它包含4个元素 即4个列元素 如 a 0 又包含 a 0 0 a 0 1 a 0 2 a 0 3 计算机教学中心 李勇C语言程序设计教程 48 一维数组名a i 代表第i行的首地址 即第i行中第0列元素的地址 既 a i 0 a i j 代表第i行中的第j个元素的地址 即为 a i j 注意地址变化的单位数值在不同的场合的实际字节数是不同的 a 1 中的 1 实际代表数组中一行元素所占的总字节数 a i 1 中的 1 代表数组中一个元素所占的字节数 计算机教学中心 李勇C语言程序设计教程 49 a代表第0行的首地址 a 1代表第1行的首地址 a 2代表第2行的首地址 每行存放4个整型数据 即1个元素占2个字节 因此 这里 1的含义是 4 2 8个字节 计算机教学中心 李勇C语言程序设计教程 50 计算机教学中心 李勇C语言程序设计教程 51 例8 6用指针表示法输出二维数组的各元素 includemain staticinta 2 3 0 1 2 3 4 5 intk j p for j 0 j 2 j 方式1 for k 0 k 3 k printf 5d a j k a j 是j行首地址 a j k是j行k列元素的地址 putchar n putchar n 计算机教学中心 李勇C语言程序设计教程 52 接上页 for j 0 j 2 j 方式2 for k 0 k 3 k printf 5d a j k a j 是j行首地址 a j k是j行k列元素的地址 putchar n p a p指向数组的第一个元素 for j 0 j 2 j 方式3 for k 0 k 3 k printf 5d p 输出p所指示的元素 putchar n 计算机教学中心 李勇C语言程序设计教程 53 输出的结果是 0 3450 3450 345 计算机教学中心 李勇C语言程序设计教程 54 2 指向二维数组的指针变量有两种情况 一是直接指向数组元素的指针变量 二是指向一个含有m个元素的一维数组 这两种不同形式的指针变量 其使用方法不同 指向数组元素的指针变量 即简单指针变量 如 int p a 3 4 p 计算机教学中心 李勇C语言程序设计教程 55 注意 1 int p 4 定义一个指针变量p p指向包含4个元素的一维数组 2 p i与 p i 的区别 p i是指向第i行的指针 第i行的首地址 p i 是指向第i行第1个元素的地址 两者数值相等 但含义不同 p i的增值将以行长为单位 而 p i 增值将以元素长度为单位 计算机教学中心 李勇C语言程序设计教程 56 即 p i 1将指向第i行再下一行的首地址 而 p i 1将指向第i行首元素的下一个元素地址 见下图 设inta 3 4 p 4 p a 如果p先指向a 0 则p 1不是指向a 0 1 而是指向a 1 计算机教学中心 李勇C语言程序设计教程 57 例8 7main staticinta 3 4 1 3 5 7 9 11 13 15 17 19 21 23 int p 4 i j p a scanf i d j d 计算机教学中心 李勇C语言程序设计教程 58 8 4指针与字符串 8 4 1字符串的指针表示法回顾 利用字符数组完成字符串编程 1 字符数组的定义及初始化 例如 charstr student 2 字符数组的输入 输出 A 逐个字符的输入 输出 B 字符串整体的输入 输出 3 字符串中各个字符的引用 计算机教学中心 李勇C语言程序设计教程 59 1 字符指针变量的定义 char 指针变量 如 char p 2 字符指针的初始化 A 在定义时初始化指针变量使指针指向一个字符串 例如 char string ILoveChina B 先定义后初始化 例如 char str str Ilovechina 思考 能否charstr 20 str Ilovechina 以上语句的含义 定义str为指针变量 它指向字符型数据 且赋值语句把字符串 Ilovechina 的首地址赋给了指针变量str 计算机教学中心 李勇C语言程序设计教程 60 3 利用字符指针实现字符串的整体输入 输出A 输入 chara 20 str a 注意 char str scanf s str scanf s str B 输出 char string student printf s n string 为何不用 string 如用 string 程序应如何变化 对字符串的整体输出实际上还是从指针所指示的字符开始逐个显示 系统在输出一个字符后自动执行p 直到遇到字符串结束标志符 0 为止 而在输入时 亦是将字符串的各字符自动顺序存储在p指示的存储区中 并在最后自动加上 0 计算机教学中心 李勇C语言程序设计教程 61 4 用指针变量来实现对字符串的访问利用字符指针对字符串的访问与利用指向数组的指针来访问各个数组元素的方法相同 需要注意的是字符串结束标志 0 的使用 例 将一字符串中大写英文字母转换成小写字母 main chara 80 str a scanf s str for str 0 str if str A 思考 为什么不用str输出 计算机教学中心 李勇C语言程序设计教程 62 小结1 掌握字符指针的定义及初始化 2 理解字符指针与字符串的指向关系 3 利用字符指针引用字符串或其中某个字符 4 注意字符指针移动后指向的变化 5 注意 0 标志的作用 计算机教学中心 李勇C语言程序设计教程 63 思考题 将一已知字符串第n个字符开始的剩余字符复制为另一新的字符串 main inti n chara computer charb 10 p q p a q b scanf d 指针指到要复制的第一个字符 计算机教学中心 李勇C语言程序设计教程 64 for p 0 p q q p q 0 字符串以 0 结尾 printf Stringa s n a printf Stringb s n b 输入 3 输出 computermputer考虑一下 若输出语句改为如下语句会如何 printf stringais s n p printf stringbis s n q 计算机教学中心 李勇C语言程序设计教程 65 本章小结 1 指针是一种存放地址的变量 像其他的变量一样 须在使用前定义 指针变量的命名遵守与其他变量相同的命名规则 指针变量定义格式如下 类型名 指针变量名 2 两个与指针变量有关的运算符 取地址运算符 和 指针运算符 其中 运算符只能作用于变量 包括基本类型变量和数组的元素 不能作用于数组名和常量 其结果是取运算对象的存储地址 运算符也称间接访问运算符 其操作对象是地址 通过对该地址的间接访问达到存取变量值的目的 计算机教学中心 李勇C语言程序设计教程 66 4 可以利用指针变量方便地对数组进行存取 如果指针变量p的初值为数组a的首地址 则p i和a i就是a i 的地址 p i 和 a i 既是数组元素a i 的值 3 C语言规定向被调函数进行参数传递只能是单向值传递即传值的方式 采向被调函数传指针变量的方式则变相地实现了参数传递中非常重要的一种方式 传地址 从而使得主调函数与被调函数发生了某种意义上的关联 这样使得程序的编制更加灵活 比如我们可以通过这种参数传递方式从被调函数返回多个值 计算机教学中心 李勇C语言程序设计教程 67 5 指针指向字符串时 是把字符串的首地址赋给字符指针 可以通过 运算符对字符指针进行操作以达到操作字符串各个字符的目的 具体操作方法与利用指向数组的指针相同 计算机教学中心 李勇C语言程序设计教程 68 例 编写一个交换两个变量的函数 在主程序中调用 实现两个变量值的交换 假定a和b两个变量 分析 此程序要

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论