第八单元 应用指针程序设计 从现在开始,将详细讲述C语言的方方面面。第一章中的所有疑惑,都将一一消灭。

Slides:



Advertisements
Similar presentations
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
Advertisements

第九章 指针 西安工程大学.
第七章 指针 计算机公共教学部.
第六章 指针 指针的概念 指针变量 指针与数组 指针与函数 返回指针值的函数.
第7章 指针 存储地址的变量的类型就是指针类型 能直接对内存地址操作, 实现动态存储管理 容易产生副作用, 初学者常会出错
二级指针与二维数组.
C语言程序设计基础 第10章 指针进阶 刘新国.
10.1 二级指针 10.2 指针与二维数组 10.3 指针的动态存储分配 10.4 函数指针 10.5 main函数的参数
第8章 指针 21世纪高等学校精品规划教材.
第6章 指针 6.1 指针的概念 6.2 变量与指针 6.3 数组与指针 6.4 字符串与指针 6.5 函数与指针 6.6 返回指针值的函数
6.4 字符串与指针 1. 用字符数组存放一个字符串.
高级语言程序设计 C++程序设计教程(下) 2006年春季学期 与一些教材的区别 偏重理论,不去讨论某个系统的具体使用方法,但会涉及实现技术
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
第九章 字符串.
指 针 为什么要使用指针 指针变量 指针与数组 返回指针值的函数 动态内存分配 通过指针引用字符串 指向函数的指针 小 结 习 题.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
程序设计II 第三讲 字符串处理.
第 十 章 指 针.
C语言高级编程(第四部分) 字符串 北京大学 信息科学技术学院.
第7章 间接访问—指针 指针的概念 指针运算与数组 动态内存分配 字符串再讨论 指针作为函数参数和返回值 指针数组与多级指针
Chap 8 指针 8.1 寻找保险箱密码 8.2 角色互换 8.3 冒泡排序 8.4 电码加密 8.5 任意个整数求和*
Chap 8 指针 8.1 寻找保险箱密码 8.2 狸猫换太子 8.3 冒泡排序 8.4 加密变换问题 8.5 任意个整数求和问题*
程序设计基础 第 八 章 谌 卫 军 清华大学软件学院 2008年秋季.
辅导课程六.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
二维数组的指针表示 与复杂的指针例子 专题研讨课之三.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
C语言程序设计 北京工业大学计算机学院 软件学科部 宋凯 学时40:课堂24+上机16
C语言程序设计基础 第8章 指针 刘新国.
字符串和字符数组 字符串的输入和输出 字符串的基本操作
第六单元 应用数组的程序设计 从现在开始,将详细讲述C语言的方方面面。第一章中的所有疑惑,都将一一消灭。
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第二章 Java语言基础.
欲穷千里,更上层楼 第十章 指 针 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; 能很方便地使用数组和字符串; 并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。指针极大地丰富了C语言的功能。 学习指针是学习C语言中最重要的一环,
C++大学基础教程 第6章 指针和引用 北京科技大学 信息基础科学系.
第五章 指针 5.1 指针的概念 5.2 指针与数组 5.3 字符串指针.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
|09 陣列.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
C语言大学实用教程 第7章 指针 西南财经大学经济信息工程学院 刘家芬
函式庫補充資料.
指针 几个概念:  指针也是一种数据类型,具有指针类型的变量,称为指针变量。
C语言的特点 1. C程序由许多函数组成 2. C程序必须有且只有一个主函数main( ) 3. 函数用“{”和“}”表示起点和终点
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第6讲 指针与引用 6.1 指针 6.2 引用.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
C程序设计.
第九节 赋值运算符和赋值表达式.
3.16 枚举算法及其程序实现 ——数组的作用.
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第五章 数组与指针 1 数组的简单操作 2 数组与指针 3 字符数组与字符串 4 字符串处理函数 5 数组应用举例.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
2.6 字符型数据 一、 字符常量 1、字符常量的定义 用一对单引号括起来的单个字符,称为字符常量。 例如,‘A’、‘1’、‘+’等。
第7章 模板 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
_03宽字符与Unicode编程 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C语言程序设计 第8章 指针.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
基本知识 数据类型、变量、常量、运算符.
第八章 指 针 北京邮电大学出版社.
C 程式設計— 字元與字串 台大資訊工程學系 資訊系統訓練班.
字串 第10章 part I 8/30/2019.
台大資訊工程學系 資料系統訓練班 第119期 吳晉賢
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
第7章 地址和指针 7.1 地址和指针的概念 7.2 指针变量的定义和指针变量的基类型 7.3 给指针变量赋值 7.4 对指针变量的操作
Presentation transcript:

晏文靖 yanwenjing@wxic.edu.cn 第八单元 应用指针程序设计 从现在开始,将详细讲述C语言的方方面面。第一章中的所有疑惑,都将一一消灭。 本章将讲述类型、变量、常量、数组等。这些概念的建立是进行进一步C语言学习的必要条件。同时,这些概念也是各种高级语言的共通概念。 晏文靖 yanwenjing@wxic.edu.cn

内存(Random Access Memory) 地址(Address) 所有活动指令和数据都保存在内存内 速度快,但是掉电即失(挥发性) 可以随机访问 只要指明要访问的内存单元的地址,就可以立即访问到该单元 地址是一个无符号整数(习惯用16进制数表示),其字长与机器相同 内存中的每个字节都有唯一的一个地址

指针的故事 “该程序执行了非法操作,即将关闭” 黑客攻击服务器利用的bug绝大部分都是指针和数组造成的 某些用C的人,尽量避免使用指针 这种错误几乎全是由指针和数组导致的 黑客攻击服务器利用的bug绝大部分都是指针和数组造成的 某些用C的人,尽量避免使用指针

指针的故事 是“稀饭”最挚爱的武器 很多“Mission Impossible”由指针完成 稀饭 == C Fans 大多数语言都有无数的“不可能” 而C语言是 “一切皆有可能” —— “Impossible is Nothing” ——

指针(Pointer) int *p; 定义了一个指针变量p,简称指针p p用来保存地址 此时这个地址是 哪呢 (p指向哪呢)? p是变量,int*是类型 变量都占用内存空间,p的大小是sizeof(int*) p用来保存地址 此时这个地址是 哪呢 (p指向哪呢)?

指针(Pointer) int i; p = &i; *p就是普通变量 p可以动态(任意)地指向不同内存,从而使*p代表不同的变量 p = &a[0];

指针 指针也是数据类型。指向不同数据类型的指针,分别为不同的数据类型 指针指向非其定义时声明的数据类型,将引起warning int*、float*、char*、int**、int***…… 指针指向非其定义时声明的数据类型,将引起warning void*类型的指针可以指向任意类型的变量 指针在初始化时一般int *p=NULL; NULL表示空指针,即无效指针 但它只是逻辑上无效,并不是真正地无效

&与*运算符 &运算的结果是指向该变量的指针 思考: *和指针的组合是一个变量,该变量的地址和类型分别是指针指向的地址和指针定义时指向的类型 int i, *p; p = &i; int *p, a[10]; p = a; int *p, a[10]; p = &a[0]; int *p, a[10]; p = &a[5]; 思考: int *p, a[10]; p = &a; *和指针的组合是一个变量,该变量的地址和类型分别是指针指向的地址和指针定义时指向的类型 int i, *p; p = &i; *p = 0; int *p, a[10]; p = a; *p = 0; int *p, a[10]; p = &a[1]; *p = 0; int *p; float f; p = (int*)&f; *p = 1;

指针与数组 数组名“可以”看作一个指针 只是不能修改这个指针的指向 常指针 int a[10]; 值为数组首地址

指针与数组 指针可当作数组名使用,反之亦然 int *p, a[10]; p = a; p[1] = 0; *a = 0;

指针运算 int* p = NULL; p++; /* p的值会是多少? */ 指针的加减运算是以其指向的类型的字节宽度为单位的 int *p, a[10]; p = a; *(p+3) 等价于 a[3] p++; *p 等价于 a[1]

指针运算 int *p, *q, a[10]; p = a; q = &a[2]; 运算法则 q - p == ? q = p + 3; 只能进行加减和关系运算 只能同类型指针之间或指针与整数之间运算 “q=p+3;”是合法语句,由此可以知道“q=p;”也是合法的。我们一直强调指针就是一个变量,所以变量之间的赋值操作自然在指针上也有效。

指针与函数 Not Work 指针既然是数据类型,自然可以做函数的参数和返回值的类型 指针做参数的经典例子: main() { int x, y; swap(x, y); } void swap(int x, int y) { int temp; temp = x; x = y; y = temp; } Not Work

这里的函数调用过程还是“实参” 的内容复制到“形参” ,千万不要理解成什么 “传引用调用” 指针做参数 这里的函数调用过程还是“实参” 的内容复制到“形参” ,千万不要理解成什么 “传引用调用” main() { int x, y; swap(&x, &y); } void swap(int *px, int *py) { int temp; temp = *px; *px = *py; *py = temp; }

2个月使用scanf目睹之怪现状 int i; scanf("%d", i); /* 这样会如何?*/ i的值被当作地址。如i==100,那么输入的整数就会从地址100开始写入内存 int i; scanf("%d", i); /* 这样会如何?*/ int i; scanf("%f", &i); /* 这样又会如何?*/ char c; scanf("%d", &c); /* 这样呢?*/ 输入被当作float,以float的二进制形式写到i所在的内存空间 输入以int的二进制形式写到c所在的内存空间。c所占内存不足以放下一个int,其后的空间也被覆盖

数组做参数 其实就是指针做参数 这里给定元素个数有意义吗? int a[10]; ProcessArray(a); 不是把整个数组的内容复制到函数内 int a[10]; ProcessArray(a); void ProcessArray(int* p) { ...... } void ProcessArray(int a[]) { ...... } 这里给定元素个数有意义吗?

数组做参数 我们应该让函数知道数组的大小 int a[10]; ProcessArray(a, 10); void ProcessArray(int a[], int n) { ...... }

数组做参数示例 main() { int a[10]; RandFill(a, 10); } void RandFill(int a[], int size) { int i; for (i=0; i<size; i++) a[i] = rand(); }

二维数组做参数 int a[10][20]; ProcessArray(a, 10); void ProcessArray(int a[][20], int m) { ...... } 这个必须 给出!

数组做返回值? ???? ProcessArray(int a[], int n) { ...... return a; } 上面语句返回的是什么类型? int* const 函数没有返回数组内容的可能,只能返回指针

指针和数组做参数 通过参数,把数据传回给调用者 通过一个参数把大量的数据送到函数内 如果只向内传送数据,就把参数定义为const,防止意外修改数据,也让函数的功能更明确 void PrintArray(const int * p, int n) { ...... } void PrintArray(const int a[], int n) { ...... }

字符串 (String) 与字符数组、字符指针 一串以'\0'结尾的字符在C语言中被看作字符串 用双引号括起的一串字符是字符串常量,C语言自动为其添加'\0'终结符 "Hello world!" 把字符串常数作为表达式直接使用,值是该常数的地址,类型为const char* C语言没有字符串类型,完全用字符数组和字符指针处理 字符数组 每个元素都是字符类型的数组 char string[100]; 字符指针 指向字符类型的指针 char* p;

字符串“赋值”还是“复制”? char* string; string = "Free your mind"; 指针赋值 char string[] = "Free your mind"; 内容复制 char string[20]; string = "Free your mind"; 非法! char string[20]; strcpy(string, "Free your mind"); String copy!

字符串处理函数 在<string.h>中定义了若干专门的字符串处理函数 strcpy: string copy char *strcpy(char *dest, const char *src); strlen: string length size_t strlen(const char *s); strcat: string catenate char *strcat(char *dest, const char *src); strcmp: string comparison int strcmp(const char *s1, const char *s2); strstr: locate a substring char *strstr(const char *s1, const char *s2);

’\0’作字符串终结符的先天不足 假若字符串没有'\0',那么这些字符串处理函数将怎样? 会一直进行处理,直到遇到一个'\0'为止。此时可能已经把内存弄得乱七八糟 ANSI C定义了一些“n族”字符串处理函数,包括strncpy、strncat、strncmp等,通过增加一个参数来限制处理的最大长度 确认:要写入字符串的地方存储空间是否足够放下所有字符和'\0'

指针、数组以及其它的类型组合 基本数据类型和修饰符 指针是一种数据类型 数组也是一种数据类型 任何类型都可以做指针或者数组的基础类型 int、char、float、double long、short、const、signed、unsigned 指针是一种数据类型 是从其它类型派生的类型 指向XX类型的指针 数组也是一种数据类型 有n个XX类型的元素 任何类型都可以做指针或者数组的基础类型 它们自己也可以做彼此或自己的基础类型 类型套类型。一个类型派生出新的类型,新的类型又能派生出新的类型,再派生出新的类型,再再派生出新的类型……子子孙孙,无穷尽也