二级指针与二维数组.

Slides:



Advertisements
Similar presentations
第九章 指针 西安工程大学.
Advertisements

第七章 指针 计算机公共教学部.
第六章 指针 指针的概念 指针变量 指针与数组 指针与函数 返回指针值的函数.
第7章 指针 存储地址的变量的类型就是指针类型 能直接对内存地址操作, 实现动态存储管理 容易产生副作用, 初学者常会出错
第七章 指针 教 材: C程序设计导论 主 讲: 谭 成 予 武汉大学计算机学院.
电子成绩单项目实现.
小微企业融资担保产品介绍 再担保业务二部 贾天
C语言程序设计基础 第10章 指针进阶 刘新国.
10.1 二级指针 10.2 指针与二维数组 10.3 指针的动态存储分配 10.4 函数指针 10.5 main函数的参数
C语言程序设计教程 单位:德州学院计算机系.
第8章 指针 ● 8.1 指针简介 ● 8.2 指针变量的操作 ● 8.3 数组与指针 ● 8.4 二维数组与指针 ●本章小结 ●本章练习.
C语言程序设计.
C语言基础——指针的高级应用 Week 05.
第6章 指针 6.1 指针的概念 6.2 变量与指针 6.3 数组与指针 6.4 字符串与指针 6.5 函数与指针 6.6 返回指针值的函数
6.4 字符串与指针 1. 用字符数组存放一个字符串.
第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址
第六节 二维数组和指针 二维数组的地址 对于一维数组: (1)数组名array表示数组的首地址, 即array[0]的地址;
8.1 指针的概念 8.2 指针变量 8.3 指针变量的基础类型 8.4 指针的运算 8.5 指针与一维数组 8.6 指针应用实例
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
第九章 指针 目录 指针与指针变量的概念 变量的指针和指向变量的指针变量 数组的指针和指向数组的指针变量
C语言程序设计 第十二章 位运算.
第6章 指针 学习目的与要求: 了解指针的概念和相关术语 熟练掌握指向变量、数组和字符串的指针变量的使用方法 了解指向函数的指针变量
高级语言程序设计 主讲人:陈玉华.
指 针 为什么要使用指针 指针变量 指针与数组 返回指针值的函数 动态内存分配 通过指针引用字符串 指向函数的指针 小 结 习 题.
選擇排序法 通訊一甲 B 楊穎穆.
第 十 章 指 针.
项目六 用指针优化学生成绩排名 项目要求 项目分析
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
C语言程序设计 李祥.
程序设计基础 第 八 章 谌 卫 军 清华大学软件学院 2008年秋季.
第8章 善于利用指针 8.1 指针是什么 8.2 指针变量 8.3 通过指针引用数组 8.4 通过指针引用字符串 8.5 指向函数的指针
二维数组的指针表示 与复杂的指针例子 专题研讨课之三.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
6.4.1指针与二维数组 1、二维数组结构的分析 设有数组定义为:int a[3][4]; 则有: a表示数组在内存中的首地址。
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第8章 指针.
第八章 使用指针.
第十章 指针.
欲穷千里,更上层楼 第十章 指 针 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; 能很方便地使用数组和字符串; 并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。指针极大地丰富了C语言的功能。 学习指针是学习C语言中最重要的一环,
第五章 习题课 电子信息与计算机科学系 曾庆尚.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C语言复习3----指针.
C语言复习2----函数.
C语言大学实用教程 第7章 指针 西南财经大学经济信息工程学院 刘家芬
Main() { Dfas Asdfasf fasdfa } #include <stdio.h> void main( ) {
指针 几个概念:  指针也是一种数据类型,具有指针类型的变量,称为指针变量。
C语言的特点 1. C程序由许多函数组成 2. C程序必须有且只有一个主函数main( ) 3. 函数用“{”和“}”表示起点和终点
第6讲 指针与引用 6.1 指针 6.2 引用.
第1章 绪论(二) 教学目标 理解算法的特性及评价标准 掌握算法时间复杂度和空间复杂度的分析方法 1/
第六章 指针 C++程序设计中使用指针可以: 使程序简洁、紧凑、高效 有效地表示复杂的数据结构 动态分配内存 得到多于一个的函数返回值.
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
小学5.
C qsort.
第九节 赋值运算符和赋值表达式.
项目1 C程序设计起步 学习目标: 通过该项目你可以知道: C语言的用途。 C语言的基本符号和关键字。 C语言程序的结构及特点。
第一章 C语言概述 目录 什么是语言、程序 C语言的历史与发展 C语言的书写形式与程序结构 运行C语言的步骤与方法
第二章 类型、对象、运算符和表达式.
第2章 数据类型与表达式 学习目的与要求: 掌握C 语言的基本数据类型及使用方法 掌握C程序中常用的运算符和表达式 了解数据类型的转换.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C程序设计.
第七章  数 组.
C语言程序设计 第8章 指针.
§12-5 同方向同频率两个简谐振动的合成 一. 同方向同频率的简谐振动的合成 1. 分振动 : 2. 合振动 : 解析法
第九章 指针 C程序设计中使用指针可以: 使程序简洁、紧凑、高效 有效地表示复杂的数据结构 动态分配内存 得到多于一个的函数返回值.
第八章 指 针 北京邮电大学出版社.
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
C语言基础学习 从外行到入门.
Presentation transcript:

二级指针与二维数组

7.9 指向指针的指针 1. 指向指针的指针的定义、赋值及引用 如果一个指针变量存放的是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量,简称为“二级指针”变量,其定义的一般格式如下: 基类型名 **(指针变量名); 例如: int i=10; int *p=&i; int **pp=&p;

下列程序段的输出结果是( ) int **pp,*p,a=10,b=20; pp=&p; p=&a; p=&b; printf("%d,%d\n",*p, **pp); A) 10,20 B) 20,10 C) 20,20 D)10,10

7.7 指向二维数组的指针 7.7.1 二维数组的地址 C语言中,二维数组可以看成由多个一维数组组成。 例如:int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}; 可以按下面的方式来看待数组a: 二维数组a可以看成是由a[0]、a[1]、a[2]三个元素组成的一维数组,a是它的数组名。a[0]、a[1]和a[2]又都是一维数组,它们的数组名分别叫a[0]、a[1]和a[2] 。 由于数组名是指针,所以a[0]、a[1]和a[2] 为一级指针,它们的基类型是int。a是是由三个一级指针组成的数组。 a与a[0]的区别?a+1与a[0]+1区别?

a+1跨过了二维数组的一行,所以,a、a+1和a+2称为行地址。 相对于a[0]而言,a[0]+1只跨过了二维数组的一个元素,所以将a[0]、a[0]+1、a[0]+2等称为列地址。

通过以上分析可以看出: (1) a+i是第i行的地址,所以,*(a+i)即为a[i]。这样,a[i][j] 等价于 (*(a+i))[j]。 (2) a[i]+j是第i行第j列元素的地址,所以,*(a[i]+j)等价于a[i][j]。将a[i]用*(a+i)替换得:*(*(a+i)+j)也等价于a[i][j]。 上述等价关系总结如下: a[i][j] ←→ (*(a+i))[j] ←→ *(a[i]+j) ←→ *(*(a+i)+j)

用二级指针访问二级数组 #include <stdio.h> #define N 2 #define M 3 int main (void ) { static int a[N][M]={1,2,3,4,5,6}; int *arr[N]={a[0],a[1]}; int i,j,**p=arr; for (i=0;i<M;i++) printf ("%d ",*(*p+i)); printf("\n"); for(j=0;j<N;j++) for (i=0;i<M;i++) printf ("%d ",*(*(p+j)+i)); printf("\n"); return 0; } 运行结果如下: 1 2 3 1 2 3 4 5 6

二维数组a 1 2 3 4 5 6 a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] 指针数组arr a[0] a[1] p p+1 arr[0] arr[1] 二级指针变量p *p *(p+1) *p+1 *(p+1)+1 *(p+1)+2

7.7.2 指向二维数组行的指针变量 也就是定义指向二维数组行的指针变量。 例如,对二维数组a[3][4],可用如下格式定义指向行的指针变量: int (*p)[4]; 其中,[4]表示二维数组列的大小 对行指针进行赋值时只能赋行地址。例如: int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}; p=a; 或 p=&a[0]; 不能赋列地址,如下面的赋值语句是错误的: p=a[0]; 或 p=&a[0][0];

若有定义语句int (*p)[4];,则以下说法正确的是( ) A) 定义语句非法 B) p是一个指针数组,每个元素是一个指向整型变量的指针变量 C) p是一个行指针变量,可以将每行具有四个整型元素的二维数组名赋给它 D) p是一个指向整型变量的指针变量

设有程序段: int a[2][3],(*pa)[3],x; pa=a; 则以下对数组元素的引用,错误的是( ) A) x=*(a[0]+2); B) x=*pa[2]; C) x=pa[0][0]; D) x=*(pa[1]+2);

7.6 指针数组 一维指针数组的定义格式如下: 基类型 *指针变量名[数组长度]; 例如: 基类型 *指针变量名[数组长度]; 例如: int *p[3], i=1, j=2, k=3; p[0] = &i; p[1] = &j; p[2] = &k; printf("%d,%d,%d\n",*p[0],*p[1],*p[2]); 数组元素是指针

若有定义语句: char *name[]={"JAME","XML","C++"};,则语句printf("%s\n",name[2]);的输出结果是( ) A) JAME B) XML C) C++ D) 不定值

【例7-14】对参加北京奥运会的国家名称按由小到大的顺序排序后输出。 采用两种方法来实现,并比较它们的优劣,以便体会到采用指针的好处。 数组法与指针法

#include <stdio.h> #include <string.h> #define N 4 #define LEN 20 void main() { int i,j; char temp[LEN],name[N][LEN]={“China”,”America”,”Australia”,”Japan”}; for(i=1;i<=N;i++) //排序,控制趟数 for(j=0;j<N-i;j++) //控制每一趟的比较次数 if(strcmp(name[j],name[j+1])>0 { strcpy(temp,name[j]); strcpy(name[j],name[j+1]); strcpy(name[j+1],temp); } for(i=0;i<N;i++) printf("%s\n",name[i]);

#include <stdio.h> #include <string.h> #define N 4 void main() { int i,j; char *temp,*name[N]={"China","America","Australia","Japan"}; for(i=1;i<=N;i++) //排序,控制趟数 for(j=0;j<N-i;j++) //控制每一趟的比较次数 if(strcmp(name[j],name[j+1])>0 { temp=name[j]; name[j]=name[j+1]; name[j+1]=temp; } for(i=0;i<N;i++) printf("%s\n",name[i]); 移动指针