从问题到程序——指针

Size: px
Start display at page:

Download "从问题到程序——指针"

Transcription

1 指针

2 地址与指针

3 3 内存地址 : 内存单元的编号 程序执行期间数据存放在内存区 : 有确定的存储位置, 且占据一定的内存单元 ; 机器语言通过地址访问数据, 高级语言将变量等作为存储单元 / 地址的抽象 ; 建立变量是分配存储单元, 赋值是将值存入单元, 取值是从单元中提取值 ; 任何变量在存在期间均有确定的存储位置, 有固定的地址 ( 寄存器变量除外 ); 内存的地址用固定长度的二进制编码, 可作为程序处理的数据 地址值 / 指针值

4 4 指针变量 ( 指针 pointer) 以地址为值的变量, 提供了一种访问其他对象的手段 ; 指针变量 p 变量 x 指针 p 指向 x 主要的指针操作 指针变量 p 指针赋值 : 将程序对象 ( 如变量等 ) 的地址存入指针变量 ; 或将一个指针的值赋给另一个指针变量 y ; 间接访问 : 通过指针访问被指向的对象 指针变量可赋值 变量 x

5 指针变量的定义和使用

6 6 定义指针变量 指针变量的类型 : 指针都有类型, 即只能保存特定类型的变量的地址 ; 指向 int 类型的指针 p:p 只能指向 int 变量 ;p 所指的总被认为是 int 变量 ; 从 p 间接访问的变量总被当成 int 变量 ; 简称 p 为整型指针, 其类型用 (int *) 表示 ; 定义形式 : 用类型名指明其指向对象的类型, 且变量名前加 * 号说明其为指针变量 ; 基类型 * 指针变量名 ; 例 :int *p, n, a[10], *q, *p1, m;

7 7 指针操作 取地址运算 : 一元运算符 & 优先级同其他一元运算符 ; 右结合 ; & 放在变量描述 ( 如变量名 ) 前取得变量地址 : 是对应类型的指针值, 可赋给类型合适的指针变量 ; p = &n; q = p; p1 = &a[1]; 指针变量 p 指针变量 q 变量 n 多个指针可能同时指向同一个变量 ; 指针变量相等说明两个指针指向程序里同一个对象 ( 相同的内存地址 )

8 8 指针操作 间接运算 : 一元运算符 * 优先级同其他一元运算符 ; 右结合 ; 运算对象是指针变量, 间接运算得到其所指变量 放在表达式中表示取被指变象的值参与运算 间接访问 ;(c.f. 直接访问 ) 放在赋值运算符左边表示给被指变量赋值 间接赋值 ;(c.f. 直接赋值 ) 间接赋值 :*p = 17; /* 写 *p 相当于直接写 n*/ 间接访问 :m = *p + *q * n; /* 将访问 n 三次 */

9 9 指针操作 例, 设 p 指向 n ++ *p; /* 使变量 n 的值加 1, 变成 18 */ (*p)++; /* 使 n 的值再加 1, 变成 19 */ *p += *q + n; /* n 被赋以新值 57 */ q = &a[0]; /* q 指向了数组 a 的元素 */ &*P 的含义? *&n 的含义?

10 10 指针作为函数参数 问题 : 定义函数 swap 交换两个参数的值 ; 需要同时改变两个变量, 无法通过返回值解决 ; void swap0 (int x, int y) { int t = x; x = y; y = t; } int f( ) { int a = 5, b = 10; swap0(a, b); /* 不行 */ }

11 值传递:单向传递11 指针作为函数参数 swap0 的 栈区 f 的栈区 t( 变量 ) x( 参数 ): 5(=a 的值 ) y( 参数 ): 10(=b 的值 ) 返回地址 ( 返回 f) f 的运行状态保护区 a( 变量 ): 5 b( 变量 ): 10 参数区返回地址调用函数的运行状态保护区 调用函数 swap0 时内存现场 ( 运行栈 )

12 12 指针作为函数参数 在函数 g 内部通过指针访问外部的变量 m: 将变量 m 的地址 ( 也是值 ) 通过指针参数 p 传给函数 g, 函数内部对 p 间接访问即可操作 m, 包括对 m 赋值 变量 m g 的函数体 指针参数 p 在函数体里通过 *p 可以 访问和改变实参变量 m.

13 13 指针作为函数参数 通过指针参数改变调用环境的方案 1. 函数定义中用指针参数 ; 2. 函数内通过指针参数间接访问所指变量 void swap(int *p, int *q) { ; 3. 调用时以被操作变量的地址作为实参 } 变量 m int t = *p; *p = *q; *q = t; swap 的函数体 int f( ) { 变量 nint m = 5, n = 10; swap(&m, &n); } p q

14 地址传递:双向传递14 指针作为函数参数 swap 的 栈区 f 的栈区 t( 变量 ) p( 参数 ): m 的地址 q( 参数 ): n 的地址返回地址 ( 返回 f) f 的运行状态保护区 m( 变量 ): 5 n( 变量 ): 10 参数区返回地址调用函数的运行状态保护区 调用函数 swap 时内存现场 ( 运行栈 )

15 指针作为函数参数 int getnumber(char prompt[], int imin, } 例 int, 修改上章的带检查的数据输入函数 i;, 引进一个指针参数 *np = 0; /*, 保证使之能更好的处理输入错误 *np 被赋值 */ int imax, int repeat, int *np) { for (i = 0; repeat<=0 i<repeat; ++i) { 通过指针参数返回所读入的数值 printf("%s", prompt); ; if (scanf("%d", np)!=1 用函数返回值传递函数执行的状态信息 *np<imin *np>imax) { : 返回 1 表示输入成功,0 表示输入未能正常完成 printf("correct range [%d, %d].\n", imin, imax); while (getchar()!= '\n') ; } else 调用实例 return 1; } if (getnumber("your guess: ", 0, m-1, return 0; 5, &guess) == 0) { /* 处理输入出错的程序片段 */ } 15

16 16 与指针有关的一些问题 空指针 特殊的指针值, 表示指针变量闲置 ( 即未指向任何变量 ); 唯一对任何指针类型都合法的指针值 ; 用 0 表示, 标准库定义与 0 等价的符号常量 NULL; 将指针 p 置为空指针 : p = NULL; /* 需包含某个标准头文件 */ p = 0;

17 17 与指针有关的一些问题 指针的初始化 定义指针变量时可以用合法的指针值初始化 int n, *p = &n, *q = NULL; 如未初始化, 外部和局部静态指针自动置为空指针 ; 普通局部指针不自动初始化, 其值不确定 ; 最常见的指针使用错误 非法间接访问 : 间接访问悬空指针 ( 未保存合法变量地址的指针变量 ); int swap(p, f (...) { 注意 :&n); 间接访问其值为空指针的指针是非法的 /* 有些系统可能给出 warning */ int *p, n = 3; scanf(..., p); /* 编译时不能发现 scanf 的错误 */ *p = 2; /* 注意 :p 没有初始化, 没有指向合法变量 */ scanf("...", } n);

18 18 与指针有关的一些问题 通用 (void) 指针 类型 : (void *), 可指向任何类型的变量 ; 定义 : void *gp1,*gp2; 任何指针值 / 变量的地址可不必转换赋给通用指针 : gp1 = &n; /* gp1 指向 n( 值是 n 的地址 )*/ gp2 = &x; /* gp2 指向 x( 值是 x 的地址 )*/ gp1 = &n; 可以把通用指针的值赋给普通指针 规定 : 如果通用指针 gpt 指向变量 g, 且 g 的类型是普通指针 pt 的指向类型, 则将 gpt 的值强制转换后赋值给 pt 后, 通过 pt 保证正确访问 g p = (int *)gp1; /* 合法,p 是 (int*) */ q = (double*)gp1; /* 不合法,q 是 (double*) */

19 19 与指针有关的一些问题 通用 (void) 指针 指针类型代表一种观点 : 被整型指针指向的对象总被看成是整型变量 ; 被双精度指针指向的对象总被看成是双精度变量 ; 指针转换不是改变指针值, 而是观点的转换 : 如从整型指针转换到通用指针时将丢掉类型信息 ; C 语言保证 : 如果恢复到原有的类型 ( 从通用指针转回整型指针 ), 被指对象还可以正常使用 ; 通用指针不能够做间接运算, 主要用途是保存和提供指针值

20 指针与数组

21 21 指向数组元素的指针 类型合适的指针可指向数组元素 : int *p1, *p2, *p3, *p4; int a[10] = {1,2,3,4,5,6,7,8,9,10}; p1 = &a[0]; p2 = p1; P3 = &a[5]; p4 = &a[10]; p1 p2 p3 p4 数组 a p4 指向 a 最后元素向后的一个位置 ;C 语言保证这个地址存在, 但写 *p4 是错误的

22 22 数组名求值 sizeof( 数组名 ): 返回整个数组所占用内存的字节数 ; & 数组名 : 返回一个指向数组的指针 ; 其他表达式 : 数组名的值是一个指向数组首元素的指针常量, 其类型取决于数组元素的类型 ; 数组名不是指针变量, 不能被修改, 不可单独出现在赋值运算符 ( 或其它更新运算符 ) 的左侧 ; a++; a += 3; a = p;

23 23 数组名求值 m m[1] int a[10], *p1, *p2; p1 = a; /* 等价于 p1 = &a[0]; */ p2 = &a; /* &a 返回指向包含 10 个整型元素的数组的指针 */ int m[3][10]; 表达式 m 返回一个指向包含 10 个整型元素的数组的指针 ; 表达式 m[1] 返回一个指向整型的指针

24 24 指针运算 通过指针访问数组元素须保证不越界! 指针运算 : 由指针值出发进行的运算 p1 数组 a 当指针 p 指向数组元素时 (p 指在数组里 ): 通过 p 不仅可访问 p 所指的元素, 还可访问数组中的其他元素 p1+1 p1+4 p2-3 p2 *(p1 + 2) = 3; p2 = p1 + 5; *(p2 + 2) = 5; *(p2-2) = 4; p3 = p2; ++p3; p3 += 2; p1+9 p2+2

25 25 指针运算 指在同一个数组里的两个指针 可求差得两者之间数组元素的个数 ( 带符号整数 ) 可比较大小 n = p2 p1; /* 也可求 p1 p2 */ if (p2 > p1)... 当 p2 所指的元素在 p1 所指的元素之后时条件成立 ( 值为 1), 否则不成立 ( 值为 0); 如两个指针不指在同一数组里, 比较大小无意义

26 26 指针运算 指针的比较 : 相等 (==) 和不等 (!= ) 两个指针相等的含义 : 它们指向同一数据元素或同为空值 ; 同类型指针可进行比较 ; 任何指针都可与通用指针 以及空指针值 (0 或 NULL) 比较 ; 注 1: 通用指针可与任何指针比较相等 / 不等 / 大小 ( 如果指在同一数组里 ), 但不能作加减等其他指针运算 ; 注 2: 数组名可参与一些指针运算 ( 大小比较 / 相等 / 不等 ), 但某些不赋值的指针运算可能得到不合法的指针值 ( 结果超出数组界限 )

27 28 数组写法与指针写法 如果指针指在数组里, 通过指针访问数组元素也可用下标形式描述 p1[3] = 5; p3[2] = 8; *(p1 + 3) = 5; *(p3 + 2) = 8; 数组写法 :p[3] 一类的写法 ; 指针写法 :*(p + 3) 一类的写法 ; p 可以是数组名或指在数组里的指针变量 ; 两种写法有等价效力, 可自由选用择 问题 :b[i][j] 的指针写法?

28 29 数组参数的意义 C 规定函数的数组参数即是相应类型的指针参数 : 数组参数是利用指针实现的, 因而采用数组参数的函数能修改实参数组 ; int f(int n, int d[]) {......} int f(int n, int *d) {......} 函数体内也可用指针写法做数组元素访问 ; 函数里不能用 sizeof 确定实参数组的大小 : 函数的数组形参实际是指针参数, 用 sizeof 算出的是指针变量的大小

29 30 基于指针运算的数组程序设计 问题 : 设有 int 数组 a 和指针 p1 p2, 打印 a 的元素 1. for (p1 = a, p2 = a+10; p1 < p2; ++p1) printf("%d\n", *p1); 2. for (p1 = a; p1 < a+10; ++p1) printf("%d\n", *p1); 3. for (p1 = p2 = a; p1 - p2 < 10; ++p1) printf("%d\n", *p1); 4. for (p1 = a; p1 - a < 10; ++p1) printf("%d\n", *p1);

30 31 实例 1: 字符串长度函数 int strlength (const char *s) { int n = 0; while (*s!= '\0') { s++; n++; } return n; } int strlength (const char *s) { char *p = s; while (*p!= '\0') p++; return p - s; }

31 32 实例 2: 字符串复制函数 void strcopy (char *s, const char *t) { while ((*s = *t)!= '\0') { s++; t++; } } void strcopy (char *s, const char *t) { while (*s = *t) { s++; t++; } } void strcopy (char *s, const char *t) { while (*s++ = *t++) ; // 空语句 }

32 33 实例 3: 数组处理函数 1) 输出 int 数组里一段元素 : void prt_seq(int *begin, int *end) { for (; begin!= end; ++begin) printf("%d\n", *begin); } prt_seq(a, a+10); prt_seq(a+5, a+10); prt_seq(a+4, a+4); prt_seq(a+10, a+10); 2) 设置 函数 : void set_seq(int *b, int *e, int v){ for (; b!= e; ++b) *b = v; }

33 34 实例 3: 数组处理函数 3) 序列中每个元素都用其平方根取代 : void sqrt_seq (double *b, double *e){ for (; b!=e; ++b) *b = sqrt(*b); } 4) 求平均值 : double avrg(double *b, double *e) { double *p, x = 0.0; if (b == e) return 0.0; for (p = b; p!= e; ++p) x += *p; return x / (e - b); }

34 35 字符指针与字符数组 字符指针常被用来指向字符数组中的元素 ; 定义字符指针时可用字符串常量初始化 ; char *p = "Programming"; 1. 定义字符指针 p; 2. 建立字符串常量 Programming ; 3. 令 p 指向字符串常量 指针 p p r o g r a m m i n g \0 c.f. char a[] = "Programming"; 数组 a p r o g r a m m i n g \0

35 36 字符指针 vs. 字符数组 1. p 可以被重新赋值, 改变所指的对象 ;a 的存储区域固定, 不能赋值 ; p = "Programming Language C"; 2. p 和 a 的类型不同, 大小不同 :p 通常用一个机器字表示 ;a 占据 12 个字符的空间 ; 3. a 的元素可以被重新赋值 ; a[8]='e'; a[9]='r'; a[10]='\0'; C 语言规定 : 不能修改字符串常量!

36 37 字符指针与字符数组 实例 : 利用字符指针读入一行字符到数组 enum { NLINE = 256 }; char line[nline]; int count; char *p; /* */ p = line; while(p line<nline-1 && (*p = getchar())!='\n') ++p; *p = '\0'; /* 做成字符串 */ /* */ for (count = 0, p = line; *p!= '\0'; ++p) if (*p == 'e') ++count; /* 统计 e 的个数 */

37 指针数组

38 39 字符指针数组 定义 : 运算符优先级适用于定义和声明,[] 的优先级高 ; char *pa[10]; 初始化 : 定义字符指针数组时可用字符串常量提供初始值 ; char *keywords[] = { "auto", "break", "volatile", "while" }; printf("%s %s\n", keywords[0], keywords[1]);

39 40 字符指针数组 vs. 两维字符数组 char color1[][6] = {"RED","GREEN","BLUE"}; char *color[] = {"RED","GREEN","BLUE"}; 数组 color1 R E D \0 \0 \ 0 G R E E N \0 B L U E \0 \0 指针数组 color R E D \0 (a) G R E E N \ 0 B L U E \0 (b)

40 41 命令行参数 命令行是用来启动程序的字符行 : 包含命令名 ( 可执行程序的名字 ), 以及其他启动程序所需的信息 ; 在图形用户界面系统中, 命令行位于图标 / 菜单的定义 ; edit file1.txt dir \windows\system /p abcd(abcd.c abcd.exe) C 程序将命令行看成由空格分隔的字段, 每一段对应一个命令行参数 : 命令名编号为 0, 其余参数依次编号 ; 程序启动时将各命令行参数做成字符串 ; 程序里可按规定方式使用和处理各参数

41 42 命令行参数 C 程序通过 main 的参数获取 / 处理命令行参数 int main (int argc, char *argv[]); argc 代表命令行参数的个数 ; argv 是一个有 argc + 1 个字符指针的数组 : 前面 argc 个指针指向各命令行参数字符串, 最后一个是空指针 ; main 函数由系统调用 ; 即 main 函数的实参不是在程序中给出, 而是在执行程序时给出

42 43 命令行参数 5 argc argv 函数 main 命令行 prog1 there are five arguments 的执行现场 p r o g 1 \0 t h e r e \0 a r e \0 f i v e \0 a r g u m e n t s \0 0 空指针

43 44 命令行参数 例 : 写程序 echo 打印各命令行参数 #include <stdio.h> int main (int argc, char *argv[]) { int while i; (*argv!= NULL) for (i = 0; i < argc; ++i) printf("args[%d]: printf( %s\n, *argv++); %s\n", i, argv[i]); return 0; } P237 echo 程序实例演示

44 多维数组作为参数的通用函数

45 46 二维数组作为函数的参数 int fun1(int n, int mat[][10]) { mat[i][j] } void fun2(int m, int n, int mat[][]) 数组 int mat[10][8]: 首个基元素的位置是 &mat[0][0]; 每一行有 8 个基元素 ( 整数 ); 第 1 行的起始位置是 &mat[0][0]+8, 用表达式 *(&mat[0][0]+8) 可以访问第 1 行首元素 ; 用 *(&mat[0][0]+i*8) 可以访问第 i 行的首元素 ; 用 *(&mat[0][0]+i*8+j) 可以访问 mat[i][j]

46 47 解决思路 函数处理两维数组所需的信息 1. 基本元素的类型 ; 2. 数组的内存起始位置 ; 3. 数组两个维的长度 ; 数组参数 长度参数 三方面信息均可通过参数传递

47 48 实例 写通用函数输出两维整型数组, 每行输出在一行 void prtmatrix (int m, int n, int *mp){ int i, j; for (i = 0; i < m; ++i) { for (j = 0; j < n; ++j) printf("%d ", *(mp + i * n + j)); putchar('\n'); } prtmatrix(10, 8, a);? } prtmatrix(10, 8, a[0]);? prtmatrix(10, 8, &a[0][0]); prtmatrix(20, 36, &mat[0][0]);

48 动态存储管理

49 50 C 程序中变量的存储分配 共同性质 变量的存储大小是静态确定的 外部变量 局部静态变量 : 在编译时确定存储分配, 开始执行前完成分配 ; 自动变量 : 在程序执行到定义所在的函数 / 复合语句时分配存储 ; 变量和参数决定了函数执行时所需的存储空间, 且可在编译时确定 ; 静态处理存储的优点是方便 / 效率高, 执行时工作简单 / 速度快 ; 但对编程方式加了限制

50 51 学生成绩实例 问题 : 能否实现先输入数据的项数, 再据此建立数组? int n;... scanf("%d", &n); double scores[n];... /* 读入数据, 然后处理 */ 问题的实质 : 在编写程序时可能无法确定对存储的需求量

51 52 动态存储分配与释放 动态存储分配 : 程序运行中根据需求动态的分配存储 ; 程序里用指针指向动态分配的存储块, 通过指针的间接操作可使用所指的存储块 ; 动态释放 : 不再使用的动态分配的存储块应交还系统 ; 动态存储管理系统 : 完成动态分配 / 释放工作 ; 是程序运行系统的子系统, 管理称作堆 (heap) 的一片存储区 <stdlib.h>

52 53 存储分配函数 malloc void *malloc(size_t ns); /* size_t 是某整型 */ 功能 : 分配一块不小于 ns 的连续存储, 并返回其地址 ; 如申请未成功即返回空指针值 int n; double *data;... scanf("%d", &n); data = (double*) malloc(n * sizeof(double)); if (data == NULL) {... /* 分配未完成时的处理 */ }..data[i]..*(data+j)../* 正常处理 */

53 54 malloc 函数的说明 size_t: 标准库中定义的一种数据类型, 是某种无符号整型 ; 具体类型由具体的 C 系统确定 ; 是 sizeof 的返回值类型 ; malloc 的返回值 (void *) 需通过强制类型转换成特定指针类型后, 再赋值给指针变量 ; 计算所要分配的存储块大小时应使用 sizeof, 不应该直接写数值 ; 动态分配必须检查分配成功与否 ; 动态分配的存储块大小是确定的, 越界使用 ( 尤其是越界赋值 ) 是非法的

54 55 带计数和清 0 的存储分配函数 calloc void *calloc(size_t n, size_t size); 其中,size 是数据元素大小,n 是元素个数 功能 : 分配足够存放 n 个大小为 size 的元素的连续存储块, 并把存储块全部初始化为 0; 如无法分配时返回空指针值 ; data = (double*) calloc(n, sizeof(double));

55 56 动态存储释放函数 free void free(void *p); 功能 : 释放指针 p 所指的存储块 ( 必须是通过动态存储分配得到 );p 值为空指针时什么也不做 ; int fun (...) { int *p;... p = (int *)malloc(...);... free(p); return...; }/* 退出函数前应释放函数内分配且已无用的动态存储 */

56 57 free 函数的说明 执行 free(p) 后不改变 p 的值, 但被指块内容可 能已变, 因此不允许间接访问已释放的存储块 ; 不可以对非指向动态分配存储块的指针使用本操作 ; 动态存储块的释放只可通过调用 free 完成 ; 为保证动态存储区的有效使用, 不再使用的动态分配块时应该及时释放 ; 动态存储的流失 : 如程序长期执行, 存储流失可能成为严重的问题

57 58 分配调整函数 realloc void *realloc(void *p, size_t n); 其中,p 指向原动态分配块,n 是新的大小要求 功能 : 更改已有的分配, 返回大小至少为 n 的存储块的指针 ; q = (double*)realloc(p, m * sizeof(double)); if (q == NULL) { } /* 特殊处理 : 分配未成功,p 仍指原块 */ else { } 如果无法分配则返回空指针, 原块不变 ; 如果成功分配后, 新块与原块的内容一致, 而 p 原块的内容可能改变 = q; /* 令 p 指向新块 :, 正常处理新块较小时保存原块 */... n 范围内的数据 ; 新块较大时原数据存在前部, 新增加的部分不初始化

58 59 realloc 函数的说明 缩小 : 从原存储块的尾部截掉并回收多余部分, 块的起始位置和保留部分的内容不变 ; 扩大 : 如果原存储块之后有足够多的可用内存, 新分配块 = 原块 + 扩大部分, 块的起始位置和原块的内容不变, 扩大部分不初始化 ; 如果原存储块之后没有足够多的可用内存, 则重新申请内存 : 如申请成功, 复制数据至新块的前部, 返回新块地址并自动释放原块 ; 如果申请失败, 返回 NULL, 保持原块内容不变 ( 即不释放 不复制, 无用时需显式 free 原块 )

59 60 realloc 函数的说明 传递给 realloc 的指针必须是一个通过 malloc,calloc 或 realloc 返回的指针 ; 不能对指向动态分配块中的其他位置的指针调用 realloc 和 free; 不能对指向非动态分配块的指针 ( 数组名 指向字符串常量的指针等 ) 调用 realloc 和 free; char *buff; buff = (char *)malloc(100); buff += 50; free(buff); realloc(null, n) 等价于 malloc(n); realloc(p, 0) 等价于 free(p);(c99 有新规定 )

60 61 常见的动态内存错误 1. 未检查所请求内存是否成功分配 ; 2. 操作动态分配时超出了所分配内存的边界 ; 3. 释放并非动态分配的内存 : 传递给 free 的指针必须是一个从 malloc calloc 或 realloc 函数返回的指针 ; 4. 试图释放一块动态分配的内存的一部份 (realloc 函数可能缩小一块动态分配的内存, 有效释放其尾部的部分内存 ); 5. 继续访问已经被 free 函数释放的内存

61 62 实例 1: 修改筛法程序 要求 : 由命令行参数获得所需的范围 ; 如无命令行参数则要求用户输入确定范围的整数值 ; 工作一 : 将命令行参数 ( 字符串 ) 转换成整数 ; int s2int(const char *s) { int n; for (n = 0; isdigit(*s); ++s) n = 10 * n + (*s - '0'); return n; }

62 63 实例 1: 修改筛法程序 工作二 : 用函数封装筛法计算 void sieve(int lim, int an[]) { 工作三 : 主函数的工作内容 // 函数体的实现略, 类似于 p182 的主函数 // 只涉及筛法算法, 不涉及空间管理 1. 由命令行参数或用户输入获取范围 ; } 2. 分配空间及初始化 ; 3. 执行筛法 ; 4. 打印输出 ; 5. 释放空间

63 enum { LARG = }; int main(int argc, char **argv) { int i, j, n, *ns; /* 通过命令行参数或者用户输入获取范围 */ if (argc == 2) n = s2int(argv[1]); else getnumber("largest: ",2,LARG,5,&n); if (n < 2 n > LARG) { printf("largest must in [2, %d]",larg); return 1; } ns = (int*) malloc(sizeof(int)*(n+1))/* 分配 */ if (ns == NULL) { /* 检查分配是否成功 */ printf("no enough memory!\n"); return 2; } sieve(n, ns);... /* 输出略 */ free(ns); /* 释放 */ return 0; } 64

64 65 实例 2: 改造成绩直方图程序 要求 : 程序能处理任意多个成绩数据 ; 问题 : 如何处理事先无法确定数目的数据集合? double* readscores(int* np); int 函数 main(){ readscores 根据需求申请动态分配存储块, 并返回分配的块和实际项数 int n; : 通过 np 返回项数, double 无法得到存储时返回 *scores = readscores(&n); NULL; 如已读部分数据后扩大存储失败 if(scores ==, NULL) 给出提示信息并返回部分 return 1; 数据 ; }... /* 其他不必修改 */

65 enum { INUM = 40 }; double* readscores(int* np) { unsigned size = INUM, n; double *q, x, *p; if((p=(double*)malloc(inum*sizeof(double)))==null) { printf("no memory. Stop\n"); *np = 0; return NULL; } for(n=0; scanf("%lf", &x) == 1; ++n) { if (n == size) { /* 块满了, 需要重新分配 */ size *= 2; q = (double*)realloc(p, size*sizeof(double)); if (q == NULL) { printf("process only %d scores.\n", n); break; } p = q; } p[n] = x; } *np = n; return p; } 66

66 67 实例 2: 改造成绩直方图程序 readscores 函数的另一种实现方案 函数返回值为存储块的大小, 无法完成时返回 0; 通过参数获得动态存储块的地址 (double *), 实参应该是 (double *) 变量的地址, 而形参就应该是指向 (double *) 类型的指针, 即 (double **) 类型 ; 函数原型 :int readscores(double** dpp); 调用方式 :if(readscores(&scores)==0){ }

67 68 总结 : 关于动态存储分配 计算机系统的内存由 OS( 操作系统 ) 管理 : 启动一个程序时,OS 为其分配内存以存放代码和数据 ; 程序结束时 OS 收回该程序占用的所有内存 ; C 程序启动时从 OS 得到内存, 其中的动态存储区由该程序的动态存储管理系统管理 程序运行中调用 malloc 函数将从中分配存储,free 函数把不用的内存块退回动态存储管理系统 ( 分配和释放属于 C 程序内部事务 ); C 程序结束时,OS 收回原先分配给该程序的全部内存 ( 这属于 OS 的存储管理问题, 与 C 程序无关 ); 存储流失是 C 程序内部问题, 非 OS 的问题

68 定义类型

69 70 定义类型 形式 : 由关键字 typedef 引导, 其后的描述形式与变量定义类似, 而原变量名位置的标识符即是新的类型名 ; 作用一 : 简化程序书写 typedef unsigned long int ULI; ULI x, y, *p; p = (ULI *)malloc(n * sizeof(uli)); 作用二 : 提高程序的可读性和清晰性 typedef double LENGTH; typedef double AREA;

70 71 定义数组类型 例 1:4 个元素的双精度数组类型 typedef double VECT4[4]; VECT4 v1, v2; /* 定义两个 4 元素的双精度数组 */ int f(vect4 v, VECT4 u); 例 2:5x5 的双精度数组类型 typedef double MAT[5][5]; MAT a1, a2, a3; /* 定义 5 5 数组变量 */ double det(mat m); /* 说明函数参数 */ MAT *p = (MAT *)malloc(sizeof(mat));

71 72 定义指针类型 例 : typedef int * IP; /* 整型指针类型 */ typedef MAT * MATP; /* MAT 类型的指针类型 */ 如用宏定义实现, 可能有意外的结果, 例 #define MIP int * MIP mp1, mp2; /* 希望定义两个指针 */ 注意 : 展开后 mp2 不是指针, 而是 int 变量 ; 宏是低级正文代换机制, 应尽量少用 ; 需要定义类型名时, 应该使用 typedef

72 73 复杂类型描述与解读 类型描述中可能的成份 1. 已有的类型名 (int,char,double 等 ); 2. 被定义的标识符 ( 类型名 ); 3. 构造符号 ( 三个 / 组运算符 ): *- 指针 []- 数组 ()- 函数 4. 可加圆括号改变结合关系 ; 解读规则 : 符号的意义不变, 优先级和结合关系依据运算符的规定 ; 解读方式 : 先确认被声明 / 定义的标识符, 从其向外分析 ( 先右后左 )

73 74 复杂类型描述与解读 例 1:int *f(int); 声明 f 是函数 : 有一个 int 参数 返回 int 指针值 ; 例 2:int (*fp)(int); 声明 fp 是指针 : 指向一个 int 参数并返回 int 值的函数 ; 例 3:char **argv; 声明 argv 是指针 : 指向 (char *);

74 复杂类型描述与解读 try: 75 例 4:int (*dp)[16]; 例 6: int (*(*g(int))[4])(double); 声明 dp 是指针 : 指向一个 16 个元素的整型数组 ; 例 5:int *dp1[16]; 声明 dp1 是数组 :16 个元素, 元素是 int 指针 ; 声明 g 是一个函数 : 一个整型参数, 返回指针值 ; typedef int (*funp)(double); g 返回的指针值指向 4 个元素的数组 ; 数组中的每个元素是指针 typedef funp fparray[4]; ; 每个指针元素指向一个函数 Fparray *g(int); : 一个双精度参数并返回整数值

75 指向函数的指针

76 77 函数指针 C 语言提供指向函数的指针 ( 函数指针 ), 可以通过函数指针参数传递被处理的函数, 不同的调用传递不同的函数 ; 函数指针有类型 : 一个函数指针只能指向某种特定类型 ( 即具有特定原型 ) 的函数 ; 定义带函数指针参数的函数, 首先需要定义函数指针类型 ; typedef double (*MFP)(double); typedef double*(*funp)(int, int);

77 78 函数指针变量的定义和赋值 用函数指针类型定义指针变量 MFP p1, p2; double (*p1)(double),(*p2)(double); 给函数指针变量赋值 :C 语言规定, 对函数名求 值即可得到指向该函数的指针值, 可赋给类型合适的函数指针变量 ; 库函数和自定义函数均可赋值给类型合适的函数指针变量

78 79 函数指针变量的使用 例 :p1 = sin; 函数指针可以直接作为函数名使用 : x = p1(3.24);( 相当于 :x = sin(3.24);) 也可以写间接操作 : x = (*p1)(3.24);/* 注意括号 */ 说明 1: 通过函数指针调用函数, 被调的函数由函数指针当时的值决定 ; 即同样语句在不同时刻可能调用不同的函数 ; 说明 2: 绝不能调用悬空的函数指针!

79 函数指针作为函数参数 函数求根问题 y = : root(fun, 以函数指针作为求根函数的参 1.26, 7.03); 数, 重新定义弦线法求函数根的函数 : double cross(mfp fp, double x1, double x2) { double y1 = fp(x1), y2 = fp(x2); return (x1 * y2 - x2 * y1)/(y2 - y1); } double root(mfp fp, double x1, double x2) { double x, y, y1 = fp(x1); do { x = cross(fp, x1, x2); y = fp(x); if (y * y1 > 0.0) { y1 = y; x1 = x; } else x2 = x; } while (y >= 1E-6 y <= -1E-6); return x; } 函数调用实例 ( 设 fun 是类型合适的函数 ): x = root(sin, 0.4, 4.5); 80

80 81 实例 : 数值积分函数 分析 函数有 3 个参数 : 一个指向被积函数的函数指针参数 ; 两个表示积分上下限的 double 参数 ; 函数的返回值为双精度值 ; 用区域分割法逼近积分值 ( 矩形法 / 梯形法等 ); enum { DIVN = 30 }; double numint(mfp fp, double a, double b) { double res = 0.0, step = (b - a) / DIVN; int i; for (i = 0; i < DIVN; ++i) res += fp(a + i * step) * step; return res; }

81 82 实例 : 数值积分函数 double numint(mfp fp, double a, double b) { long i, divn = 10; double step, dif, res0, res; res = (fp(b)+fp(a))*(b-a)/2; } for (dif=1.0; fabs(dif)>1e-6; divn*=2) { res0 = res; step = (b - a) / divn; for (res=0.0, i=0; i<divn; ++i) res += fp(a + i*step) * step; dif = res - res0; } return res;

82 83 以函数指针为参数的数组操作实用函数 数组元素变换函数 对整个数组或其中一段元素做 变换, 将各元素修改为由它们算出来的某个值 void tran_double(double *b,double *e,mfp fp) { } for ( ; b!= e; ++b) *b = fp(*b); 调用实例 : 将 double 数组 a 前 20 个元素改为对应的平方根 tran_double(a, a+20, sqrt);

83 以函数指针为参数的数组操作实用函数 找 不匹配 目标 : 逐个比较两个 int 数组的元素, 找出第一对 不匹配 的元素 ; 可将元素的匹配方式参数化 ; 即定义 不匹配 查找函数 : 返回前一数组中不匹配元素的位置 ( 指针 ), 找不到就返回 end 的值 ; 假定匹配判断函数参数 fp 在匹配时返回非 0 值 ; int* mismatch(int *b1, int *e1, int *b2, int (*fp)(int, int)) { } for ( ; b1!= e1; ++b1, ++b2) if (fp(*b1, *b2) == 0) break; return b1; 84

84 以函数指针为参数的数组操作实用函数 使用实例 1: 匹配方式为数值相等 85 int equal(int m, int n) { return m == n; } int *p = mismatch(a, a+20, b, equal); 使用实例 2: 匹配方式为奇偶性相同 int parity(int m, int n) { return m%2==n%2;} Int *q = mismatch(a, a+30, b, parity);

85 86 本章要点 指针的概念 定义和基本操作 ; 以指针为参数的函数 特别是通过指针参数从函数里向外传递信息 ( 三个要素 ); 指针与数组的关系, 指针运算 ( 指针算术 ); 动态存储分配的基本技术 ; 指向函数的指针 ; 类型描述和解读,typedef; 指针参数和命令行参数

没有幻灯片标题

没有幻灯片标题 指针作为函数参数 : 原因 : 1 需要修改一个或多个值,( 用 return 语句不能解决问题 ) 2 执行效率的角度 使用方法 : 在函数原型以及函数首部中需要声明能够接受指针值的形参, 具体的写法为 : 数据类型 * 形参名 如果有多个指针型形参, 则用逗号分隔, 例如 : void swap(int *p1, int *p2) 它说明了形参 p1 p2 是指向整型变量的指针 在函数调用时,

More information

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式] 指针 Pointers 变量指针与指针变量 Pointer of a variable 变量与内存 (Variables and Memory) 当你声明一个变量时, 计算机将给该变量一个内存, 可以存储变量的值 当你使用变量时, 计算机将做两步操作 : - 根据变量名查找其对应的地址 ; - 通过地址对该地址的变量内容进行读 (retrieve) 或写 (set) 变量的地址称为变量的指针! C++

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

一 关于内存 数据存储 变量分类 局部变量 全局变量 静态变量 请看下面代码, 分析变量类型? int pi = 3; int Area(int r, int *sum) { int b; static int c =0; b = pi * r * r; c += b; *sum = c; retu

一 关于内存 数据存储 变量分类 局部变量 全局变量 静态变量 请看下面代码, 分析变量类型? int pi = 3; int Area(int r, int *sum) { int b; static int c =0; b = pi * r * r; c += b; *sum = c; retu 移动平台应用软件开发 C/C++/JAVA 基础 指针以及指针操作 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组北京大学二零一五年 一 关于内存 数据存储 变量分类 局部变量 全局变量 静态变量 请看下面代码, 分析变量类型? int pi = 3; int Area(int r, int *sum) { int b; static int c =0;

More information

掌握都有一定难度, 也比较容易用错 因此请读者在学习中特别注意思考, 以逐步理解其本质, 掌握正确的使用方法 下面也特别解释了指针使用中的一些常见错误, 请读者留意 指针是 C 语言的一种重要机制 用好指针机制常常可以使写出的程序更简洁有效 也有些问题必须借助指针才能处理 指针在较大的复杂软件的中使

掌握都有一定难度, 也比较容易用错 因此请读者在学习中特别注意思考, 以逐步理解其本质, 掌握正确的使用方法 下面也特别解释了指针使用中的一些常见错误, 请读者留意 指针是 C 语言的一种重要机制 用好指针机制常常可以使写出的程序更简洁有效 也有些问题必须借助指针才能处理 指针在较大的复杂软件的中使 第七章指针 本章讨论指针及其在程序中的重要作用, 包括变量地址与指针的概念,C 程序里指针的基本定义和使用, 指针和数组的关系, 函数的指针参数, 动态存储分配等问题 7.1 地址与指针 程序执行中所用的数据都存于内存 任何数据对象在能用期间都有存储位置, 占据一定数量的存储单元 内存单元按顺序排, 每个单元有一个称为内存地址的编号, 内存数据都是通过地址访问的 高级语言把存储单元 地址等低级概念用变量等高级概念掩盖起来,

More information

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式] Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];

More information

新版 明解C言語入門編

新版 明解C言語入門編 328, 4, 110, 189, 103, 11... 318. 274 6 ; 10 ; 5? 48 & & 228! 61!= 42 ^= 66 _ 82 /= 66 /* 3 / 19 ~ 164 OR 53 OR 164 = 66 ( ) 115 ( ) 31 ^ OR 164 [] 89, 241 [] 324 + + 4, 19, 241 + + 22 ++ 67 ++ 73 += 66

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN:978-7-302-13599-9, 红色封面 答案制作时间 :2011 年 2 月 -5 月 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p=&a 2. 设已定义 int x,*p=&x;, 则下列表达式中错误的是 :B)&*x 3. 若已定义 int a=1,*b=&a;,

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

新・明解C言語入門編『索引』

新・明解C言語入門編『索引』 !... 75!=... 48 "... 234 " "... 9, 84, 240 #define... 118, 213 #include... 148 %... 23 %... 23, 24 %%... 23 %d... 4 %f... 29 %ld... 177 %lf... 31 %lu... 177 %o... 196 %p... 262 %s... 242, 244 %u... 177

More information

新・解きながら学ぶC言語

新・解きながら学ぶC言語 330!... 67!=... 42 "... 215 " "... 6, 77, 222 #define... 114, 194 #include... 145 %... 21 %... 21 %%... 21 %f... 26 %ld... 162 %lf... 26 %lu... 162 %o... 180 %p... 248 %s... 223, 224 %u... 162 %x... 180

More information

《C语言程序设计》第2版教材习题参考答案

《C语言程序设计》第2版教材习题参考答案 教材 C 语言程序设计 ( 第 2 版 ) 清华大学出版社, 黄保和, 江弋编著 2011 年 10 月第二版 ISBN:978-7-302-26972-4 售价 :35 元 答案版本 本习题答案为 2012 年 2 月修订版本 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p = &a A. *p = *a B. p = *a C.p = &a D. *p =

More information

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3 浙江大学 C 程序设计及实验 试题卷 2002-2003 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:30-10:30 注意 : 答题内容必须写在答题卷上, 写在本试题卷上无效 一. 单项选择题 ( 每题 1 分, 共 10 分 ) 1. 下列运算符中, 优先级最低的是 A.

More information

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

More information

C 1

C 1 C homepage: xpzhangme 2018 5 30 C 1 C min(x, y) double C // min c # include # include double min ( double x, double y); int main ( int argc, char * argv []) { double x, y; if( argc!=

More information

C/C++ - 函数

C/C++ - 函数 C/C++ Table of contents 1. 2. 3. & 4. 5. 1 2 3 # include # define SIZE 50 int main ( void ) { float list [ SIZE ]; readlist (list, SIZE ); sort (list, SIZE ); average (list, SIZE ); bargragh

More information

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc C 语言开发入门 课程教学大纲 ( 课程英文名称 ) 课程编号 :201409210011 学分 :5 学分学时 :60 学时 ( 其中 : 讲课学时 :37 学时上机学时 :23 学时 ) 先修课程 : 计算机导论后续课程 :C++ 程序设计适用专业 : 信息及其计算机相关专业开课部门 : 计算机系 一 课程的性质与目标 C 语言开发入门 是计算机各专业必修的基础课程, 是数据结构 C++ Java

More information

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc 2 5 8 11 0 13 1. 13 2. 15 3. 18 1 23 1. 23 2. 26 3. 28 2 36 1. 36 2. 39 3. 42 4. 44 5. 49 6. 51 3 57 1. 57 2. 60 3. 64 4. 66 5. 70 6. 75 7. 83 8. 85 9. 88 10. 98 11. 103 12. 108 13. 112 4 115 1. 115 2.

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 第 12 章再谈指针 本章的基本内容是 : 指针与数组 指针与结构体 动态存储分配 由于指针可以直接对内存进行操作, 所以指针的功能非常 强大 正确灵活地使用指针可以有效地表示复杂的数据结 构, 并可动态分配内存空间, 提高程序的运行效率 任务 12.1 判断回文 问题 输入一个字符串, 判断该字符串是否为回文 ( 首尾对称的字句, 例如 abcba abba 均为回文 ) 要求用指针实现 想法 设两个指针变量

More information

第4章 栈和队列

第4章  栈和队列 期中考试成绩统计结果 ( 平均 :68) 第 9 讲指针与引用 (Part I) 周水庚 2017 年 11 月 23 日 提要 指针 指针和数组 提要 指针 指针和数组 指针与指针的作用 指针是 C 语言中用于表示程序对象地址的一类数据 指针的作用 间接引用它所指的对象 描述数据和数据之间的关系, 以便构造复杂的数据结构 利用各种类型指针形参, 能使函数增加活力 指针与数组结合, 使引用数组元素的形式更加多样

More information

新版 明解C++入門編

新版 明解C++入門編 511!... 43, 85!=... 42 "... 118 " "... 337 " "... 8, 290 #... 71 #... 413 #define... 128, 236, 413 #endif... 412 #ifndef... 412 #if... 412 #include... 6, 337 #undef... 413 %... 23, 27 %=... 97 &... 243,

More information

网C试题(08上).doc

网C试题(08上).doc 学习中心 姓名 学号 西安电子科技大学网络与继续教育学院 高级语言程序设计 (C) 全真试题 ( 闭卷 90 分钟 ) 题号一二三总分 题分 60 20 20 得分 一 单项选择题 ( 每小题 3 分, 共 60 分 ) 1.C 语言程序的基本单位是 A) 程序行 B) 语句 C) 函数 D) 字符 2. 下列四组选项中, 均是不合法的用户标识符的选项是 A)A B)getc C)include D)while

More information

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式] 函数 Function 如何重用代码 How to reuse code 3 4 = 3*3*3*3 3 4,6 5 : 拷贝 - 粘帖代码 (Copy-paste code) 3 4,6 5,12 10 : 拷贝 - 粘帖代码 (Copy-paste code) Bad! 使用函数 (with a function) 使用函数 (with a function) 使用函数 (with a function)

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; Memory & Pointer trio@seu.edu.cn 2.1 2.1.1 1 int *p int a 0x00C7 0x00C7 0x00C7 2.1.2 2 int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; 2.1.3 1. 2. 3. 3 int A,

More information

untitled

untitled A, 3+A printf( ABCDEF ) 3+ printf( ABCDEF ) 2.1 C++ main main main) * ( ) ( ) [ ].* ->* ()[] [][] ** *& char (f)(int); ( ) (f) (f) f (int) f int char f char f(int) (f) char (*f)(int); (*f) (int) (

More information

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p NOWOER.OM /++ 程师能 评估. 单项选择题 1. 下 描述正确的是 int *p1 = new int[10]; int *p2 = new int[10](); p1 和 p2 申请的空间 的值都是随机值 p1 和 p2 申请的空间 的值都已经初始化 p1 申请的空间 的值是随机值,p2 申请的空间 的值已经初始化 p1 申请的空间 的值已经初始化,p2 申请的空间 的值是随机值 2.

More information

C

C C 14 2017 5 31 1. 2. 3. 4. 5. 2/101 C 1. ( ) 4/101 C C ASCII ASCII ASCII 5/101 C 10000 00100111 00010000 ASCII 10000 31H 30H 30H 30H 30H 1 0 0 0 0 0 ASCII 6/101 C 7/101 C ( ) ( ) 8/101 C UNIX ANSI C 9/101

More information

C++ 程式設計

C++ 程式設計 C C 料, 數, - 列 串 理 列 main 數串列 什 pointer) 數, 數, 數 數 省 不 不, 數 (1) 數, 不 數 * 料 * 數 int *int_ptr; char *ch_ptr; float *float_ptr; double *double_ptr; 數 (2) int i=3; int *ptr; ptr=&i; 1000 1012 ptr 數, 數 1004

More information

PowerPoint Presentation

PowerPoint Presentation C++ 程序设计 第 12 章管理 计算机学院黄章进 zhuang@ustc.edu.cn 内容 管理 12.1 (12.1.2) 12.2 动态数组 (12.2.1) 2 对象生存期 之前程序中所使用的对象有严格定义的生存期 全局对象在程序启动时分配, 在程序结束时销毁 局部自动对象在进入定义所在块中被创建, 在离开块时销毁 局部静态对象在第一次使用前分配, 在程序结束时销毁 C++ 还支持动态分配对象

More information

2015年计算机二级(C语言)模拟试题及答案(三)

2015年计算机二级(C语言)模拟试题及答案(三) 2016 年计算机二级 (C 语言 ) 模拟试题及答案 (3) 1.( A ) 是构成 C 语言程序的基本单位 A 函数 B 过程 C 子程序 D 子例程 2.C 语言程序从 ( C ) 开始执行 A 程序中第一条可执行语句 B 程序中第一个函数 C 程序中的 main 函数 D 包含文件中的第一个函数 3 以下说法中正确的是( C ) A C 语言程序总是从第一个定义的函数开始执行 B 在 C 语言程序中,

More information

试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期 " 开放本科 " 期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默

试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期  开放本科  期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默 试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期 " 开放本科 " 期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默认扩展名为 ( ) A. cpp B. c C. exe D. obj 2. 设 x 和 y 均为逻辑值,

More information

Microsoft PowerPoint - C语言课件-9-结构体.pptx

Microsoft PowerPoint - C语言课件-9-结构体.pptx 第九章结构体 郎大鹏 第九章结构体 9.1 结构体类型的声明方法 9.2 结构体类型变量的定义与使用 9.3 结构体数组 9.4 编程举例 9.5 习题 9.1 结构体类型的声明方法 结构体声明的语法形式如下 : struct 结构体标识符 成员变量列表 ; }; 例如, 为了描述班级 ( 假设仅仅包括班级编号 专业 人数等信息 ), 可以声明如下的结构体类型 struct Class char Code[10];

More information

untitled

untitled 1 DBF (READDBF.C)... 1 2 (filetest.c)...2 3 (mousetes.c)...3 4 (painttes.c)...5 5 (dirtest.c)...9 6 (list.c)...9 1 dbf (readdbf.c) /* dbf */ #include int rf,k,reclen,addr,*p1; long brec,erec,i,j,recnum,*p2;

More information

《计算概论》课程 第十九讲 C 程序设计语言应用

《计算概论》课程 第十九讲  C 程序设计语言应用 计算概论 A 程序设计部分 字符数组与字符串 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn 字符数组的定义 #include int main() char a[10] = 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ; for (int i = 0; i < 10; i++) cout

More information

C/C++语言 - 运算符、表达式和语句

C/C++语言 - 运算符、表达式和语句 C/C++ Table of contents 1. 2. 3. 4. C C++ 5. 6. 7. 1 i // shoe1.c: # include # define ADJUST 7. 64 # define SCALE 0. 325 int main ( void ) { double shoe, foot ; shoe = 9. 0; foot = SCALE * shoe

More information

第五讲 数组 一维数组 二维数组 数组作为函数参数

第五讲 数组 一维数组 二维数组 数组作为函数参数 第五讲 数组 一维数组 二维数组 数组作为函数参数 一维数组 2 数组 数组 : 具有一定顺序关系的若干相同类型变量的集合体 一维数组的声明 类型标识符变量名 [n] 声明一个长度为 n 的数组 ( 向量 ) 类型标识符 : 数组元素的数据类型 ; n: 数组的长度, 即元素的个数 ; 例 : int x[5] // 声明一个长度为 5 的一维数组 一维数组的引用 变量名 [k] // 注 : 下标

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 第六讲 指针与字符串 为什么指针 持久动态内存分配 字符串 ( 字符数组 ) 指针 什么是指针 指针的定义与运算 指针与一维 ( 二维 ) 数组 指针数组 指针与引用 指针与函数 2 指针定义 什么是指针 指针变量, 简称指针, 用来存放其它变量的内存地址 指针的定义 类型标识符 * 指针变量名 声明一个指针类型的变量, 星号后面可以留空格 类型标识符表示该指针所指向的对象的数据类型, 即该指针所代表的内存单元所能存放的数据的类型

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

Microsoft PowerPoint - 01_Introduction.ppt

Microsoft PowerPoint - 01_Introduction.ppt Hello, World C 程序设计语言 第 1 章章观其大略 孙志岗 sun@hit.edu.cn http://sunner.cn prf("hello,, world\n"); 超级无敌考考你 : 如何把 hello 和 world 分别打印在两行? 2004-12-19 A Tutorial Introduction 2 hello.c 打印华氏温度与摄氏温度对照表 计算公式 : C=(5/9)(

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

文件

文件 CH10 文件 1 文件的概念 一 文件分类 二 文件的组织结构 : ASCII 码文件 ( 文本文件 ) 二进制文件 文件是二进制代码的, 则文件就是字节流 文件是 ASCII 码的, 则文件就是字符流, 也是字节流 1 如 : 对于整型变量 x, 其值为 32767 若以文本方式存放, 则共有 5 个字符, 内容为 : 00110011 00110010 00110111 00110110 00110111

More information

C

C C 2017 3 14 1. 2. 3. 4. 2/95 C 1. 3/95 C I 1 // talkback.c: 2 #include 3 #include 4 #define DENSITY 62.4 5 int main(void) 6 { 7 float weight, volume; 8 int size; 9 unsigned long letters;

More information

untitled

untitled 数组 6.5 两维和多维数组 北京大学数学科学学院 2010-5-12 定义两维 / 多维数组 3 两维 / 多维数组的初始化 4 定义形式 : 类型说明符数组名 [ 常量表达式 ][ 常量表达式 ]; C 语言将两维数组看作一维数组的数组, 且各一维数组的元素的成员类型 / 成员个数都相同 float a[3][4]; 内嵌括号初始化成员数组 : 项数不超过成员数组的长度, 组数不超过成员数组个数

More information

C/C++ - 字符输入输出和字符确认

C/C++ - 字符输入输出和字符确认 C/C++ Table of contents 1. 2. getchar() putchar() 3. (Buffer) 4. 5. 6. 7. 8. 1 2 3 1 // pseudo code 2 read a character 3 while there is more input 4 increment character count 5 if a line has been read,

More information

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx 运算符重载 Operator Overloading class Point { public: ; double x_, y_; Why Operator Overloading? Point (double x =0, double y = 0):x_(x),y_(y) { int main(){ Point a(1., 2), b(3,4); Point c = a + b; return 0;

More information

Microsoft PowerPoint - 06_Struct.ppt

Microsoft PowerPoint - 06_Struct.ppt C 程序设计语言 第 6 章章结构 孙志岗 sun@hit.edu.cn http://sunner.cn 从基本数据类型 复合数据类型到抽象数据类型 类型本不存在 内存里存储的内容, 你认为它是什么, 它就是什么 高级语言设计了基本数据类型 : 整型 浮点型 字符型等 不同的语言也会定义不同的基本类型 基本数据类型并不能方便地解决所有问题 复合数据类型是基本数据类型迭代派生而来 典型的代表就是 结构,,

More information

第5章 递归 (Recurve)

第5章  递归 (Recurve) 第 11 讲指针与引用 (Part II) 周水庚 2016-11-24 提要 指针形参 数组形参 字符指针形参 函数形参 返回指针值的函数 程序设计 -2016 年秋 2 提要 指针形参 数组形参 字符指针形参 函数形参 返回指针值的函数 程序设计 -2016 年秋 3 函数形参 函数设置形参的目的是让函数被调用时, 能从调用处获得数据或指针信息 C 语言关于函数形参遵守以下规定 函数调用时, 形参从实参获得初值

More information

试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期 " 开放本科 " 期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. l

试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期  开放本科  期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. l 试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期 " 开放本科 " 期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. long 2. 在每个 c++ 程序中都必须包含有这样一个函数, 该函数的函数名为 ( ) A. main

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 第 1 章程序设计和 C 语言 1.1 什么是计算机程序 1.2 什么是计算机语言 1.3 C 语言的发展及其特点 1.4 最简单的 C 语言程序 1.5 运行 C 程序的步骤与方法 1.6 程序设计的任务 1.1 什么是计算机程序 程序 : 一组计算机能识别和执行的指令 只要让计算机执行这个程序, 计算机就会自动地 有条不紊地进行工作 计算机的一切操作都是由程序控制的, 离开程序, 计算机将一事无成

More information

试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期 " 开放本科 " 期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new

试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期  开放本科  期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new 试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期 " 开放本科 " 期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. long 2. 在每个 C 十 + 程序中都必须包含有这样一个函数, 该函数的函数名为 ) A.main

More information

C/C++程序设计 - 字符串与格式化输入/输出

C/C++程序设计 - 字符串与格式化输入/输出 C/C++ / Table of contents 1. 2. 3. 4. 1 i # include # include // density of human body : 1. 04 e3 kg / m ^3 # define DENSITY 1. 04 e3 int main ( void ) { float weight, volume ; int

More information

C/C++ - 字符串与字符串函数

C/C++ - 字符串与字符串函数 C/C++ Table of contents 1. 2. 3. 4. 1 char C 2 char greeting [50] = " How " " are " " you?"; char greeting [50] = " How are you?"; 3 printf ("\" Ready, go!\" exclaimed John."); " Ready, go!" exclaimed

More information

Microsoft PowerPoint - 08 指针

Microsoft PowerPoint - 08 指针 能源与动力工程学院 目录 指针 (Pointer) 陈 斌 第二节指针数组第四节指针的应用 Fortran 90/95 引入了指针的概念 指针变量的声明方法为 : Fortran 语言中, 一个指针变量可以动态地指向某个数据对象, 或者说, 对此数据对象起了一个别名 Fortran 中的指针与 C 语言中的指针并不相同, 因为它并不代表一个变量在内部存储单元中的地址, 而是代表这个变量的别名, 实质上它相当于

More information

Microsoft PowerPoint - 0 C复习.ppt [兼容模式]

Microsoft PowerPoint - 0 C复习.ppt [兼容模式] C 复习 董洪伟 http://hwdong.com 1 程序 : 数据 + 处理 ( 运算 ) 数据 : 变量和常量 int i = 3; 初始化式 变量需要定义 : 类型变量名 ; 类型变量名 = 变量或常量 ; doule pi, r=3.45,area; char var= A ; 类型变量 1, 变量 2, 变量 3; 同时定义多个变量, 逗号隔开 2 运算 : 用运算符对数据进行处理 y

More information

C/C++ - 结构体、共用体、枚举体

C/C++ - 结构体、共用体、枚举体 C/C++ Table of contents 1. 2. 3. 4. 5. 6. 7. 8. 1 C C (struct) C 2 C C (struct) C 2 i // book.c: # include < stdio.h> # define MAX_ TITLE 41 # define MAX_ AUTHOR 31 struct book { char title [ MAX_ TITLE

More information

c_cpp

c_cpp C C++ C C++ C++ (object oriented) C C++.cpp C C++ C C++ : for (int i=0;i

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

C

C C 2017 4 1 1. 2. while 3. 4. 5. for 6. 2/161 C 7. 8. (do while) 9. 10. (nested loop) 11. 12. 3/161 C 1. I 1 // summing.c: 2 #include 3 int main(void) 4 { 5 long num; 6 long sum = 0L; 7 int status;

More information

关于编写硕士研究生入学考试自命题初试科目

关于编写硕士研究生入学考试自命题初试科目 华北水利水电大学 2019 年硕士研究生入学考试初试科目考试大纲 农业综合知识三 ( 科目代码 :341) 考试大纲 考试形式和试卷结构一 试卷分值及考试时间考试时间 180 分钟 (3 个小时 ), 满分 150 分二 考试基本要求本考试大纲适用于报考华北水利水电大学农业工程与信息技术专业硕士研究生入学考试, 该科目包括 : 数据库 c 语言程序设计 计算机网络三部分内容 三 试卷内容及结构数据库部分占

More information

プログラムの設計と実現II

プログラムの設計と実現II UNIX C ls mkdir man http://www.tj.chiba-u.jp/lecture/prog2/ Ctrl+x, Ctrl+s ( )..[4]% gcc Wall o hoge hoge.c..[5]%./hoge 1 : 1 2 : 2 3 : 3 4 : 0 6..[6]% (! )..[4]% gcc Wall o hoge hoge.c..[5]%!g gcc Wall

More information

C/C++ - 数组与指针

C/C++ - 数组与指针 C/C++ Table of contents 1. 2. 3. 4. 5. 6. 7. 8. 1 float candy [ 365]; char code [12]; int states [50]; 2 int array [6] = {1, 2, 4, 6, 8, 10}; 3 // day_mon1.c: # include # define MONTHS 12 int

More information

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 复习 : Java 类型 基本类型 boolean, char, 封装 (wrappers) 类 (class) 定义 class MyType { int i;

More information

PowerPoint Presentation

PowerPoint Presentation 程序设计 II 计算机学院黄章进 zhuang@ustc.edu.cn 课程内容 C 程序设计实践 C 语言回顾 简单程序设计 数制转换 日期和时间处理, 等 字符串处理 高精度计算 枚举 C++ 语言 从 C 到 C++ 类与对象 运算符重载与类型转换 继承与虚函数 编码规范 2 教材 李文新, 郭炜, 余华山. 程序设计导引及在线实践, 清华大学出版社, 2007 C99 参考书 : K. N.

More information

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点 复习 : Java 类型 基本类型 boolean, char, 封装 (wrappers) 类 (class) 定义 class MyType { int i; double d; 数据 (Fields) char c; void set(double

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

untitled

untitled 不 料 料 例 : ( 料 ) 串 度 8 年 數 串 度 4 串 度 數 數 9- ( ) 利 數 struct { ; ; 數 struct 數 ; 9-2 數 利 數 C struct 數 ; C++ 數 ; struct 省略 9-3 例 ( 料 例 ) struct people{ char name[]; int age; char address[4]; char phone[]; int

More information

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf (%d, & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf (%d %d 2013 18 ( ) 1. C pa.c, pb.c, 2. C++ pa.cpp, pb.cpp, Compilation Error cin scanf Time Limit Exceeded 1: A 5 B 5 C 5 D 5 E 5 F 5 1 2013 C 1 # include 2 int main ( void ) 3 { 4 int cases, a, b,

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac)

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) 复习 面向对象编程 将实际问题分解成不同的对象 不的对象提供不同的服务 对象之间可以传递消息 例子小李深夜

More information

_汪_文前新ok[3.1].doc

_汪_文前新ok[3.1].doc 普 通 高 校 本 科 计 算 机 专 业 特 色 教 材 精 选 四 川 大 学 计 算 机 学 院 国 家 示 范 性 软 件 学 院 精 品 课 程 基 金 青 年 基 金 资 助 项 目 C 语 言 程 序 设 计 (C99 版 ) 陈 良 银 游 洪 跃 李 旭 伟 主 编 李 志 蜀 唐 宁 九 李 涛 主 审 清 华 大 学 出 版 社 北 京 i 内 容 简 介 本 教 材 面 向

More information

c语言面试题总结.doc

c语言面试题总结.doc 参考 : C/C++ 程序员面试指南 杨国祥等编著电子工业出版社 编程规范 1 头文件内有时会定义一些类, 结构体等, 如果被包含多次, 将会出现类型重定义的错误, 所以通常使用预处理指令来解决这个问题 #ifndef 标识 #define 标识. #endif 标识在理论上是可以自由命名的, 但每个头文件的这个标识都应该是唯一的, 标识的命名的规则一般是头文件名全大写, 前后加下划线, 并把头文件中的.

More information

C/C++ 语言 - 循环

C/C++ 语言 - 循环 C/C++ Table of contents 7. 1. 2. while 3. 4. 5. for 6. 8. (do while) 9. 10. (nested loop) 11. 12. 13. 1 // summing.c: # include int main ( void ) { long num ; long sum = 0L; int status ; printf

More information

nooog

nooog C : : : , C C,,, C, C,, C ( ), ( ) C,,, ;,, ; C,,, ;, ;, ;, ;,,,, ;,,, ; : 1 9, 2 3, 4, 5, 6 10 11, 7 8, 12 13,,,,, 2008 1 1 (1 ) 1.1 (1 ) 1.1.1 ( ) 1.1.2 ( ) 1.1.3 ( ) 1.1.4 ( ) 1.1.5 ( ) 1.2 ( ) 1.2.1

More information

2015年计算机二级(C语言)模拟试题及答案(四)

2015年计算机二级(C语言)模拟试题及答案(四) 2015 年计算机二级 (C 语言 ) 模拟试题及答案 (4) 一 填空题 1 C 语言中基本的数据类型有 : 2 C 语言中普通整型变量的类型说明符为, 在内存中占 字节, 有符号普通整型的数据范围是 3 整数-35 在机内的补码表示为 4 执行下列语句 int a=8;a+=a-=a*a; 后,a 的值是 5 有如下语句:charA[ ]={ I am a student }; 该字符串的长度是,A[3]=

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 在第 2 章中已经对 C 语言变量的声明 定义及初始化进行了介绍, 并简单介绍了 C 语言变量的作用域, 本章将对变量的存储方式进行详细的介绍, 不同存储方式的变量有不同的生命期, 作用域也各不相同 通过对 C 语言变量存储方式的介绍, 使更加深入的了解 C 语言变量的作用域的工作原理 本章讲述的知识点包括 : C 语言变量的生存期和作用域 ; C 语言局部变量与全局变量 ; C 语言变量的存储方式

More information

download.kaoyan.com_2006ÄêÌì½ò¹¤Òµ´óѧ¸ß¼¶ÓïÑÔ³ÌÐòÉè¼Æ£¨409£©¿¼ÑÐÊÔÌâ

download.kaoyan.com_2006ÄêÌì½ò¹¤Òµ´óѧ¸ß¼¶ÓïÑÔ³ÌÐòÉè¼Æ£¨409£©¿¼ÑÐÊÔÌâ 考生注意 : 本试卷共七大题, 满分 150 分 考试时间为 3 小时 ; 所有答案均写在答题纸上 ( 注明题号 ), 在此答题一律无效无效 一 选择题 ( 本题共 20 小题, 每小题 2 分, 满分 40 分 ) 1 char ch 1 2 A 0

More information

C C

C C C C 2017 3 8 1. 2. 3. 4. char 5. 2/101 C 1. 3/101 C C = 5 (F 32). 9 F C 4/101 C 1 // fal2cel.c: Convert Fah temperature to Cel temperature 2 #include 3 int main(void) 4 { 5 float fah, cel; 6 printf("please

More information

第 10 章结构体和枚举教案 一 授课题目 ( 教学章 节或主题 ) 10.1 结构体及结构体变量 10.2 结构体数组 二 教学时间安排 上课 2 学时 三 教学目的 要求 知识目标 : 学习结构体变量和结构体数组的定义和引用能力目标 : 掌握结构体的初步应用情感目标 : 通过结构体编程实践获得成

第 10 章结构体和枚举教案 一 授课题目 ( 教学章 节或主题 ) 10.1 结构体及结构体变量 10.2 结构体数组 二 教学时间安排 上课 2 学时 三 教学目的 要求 知识目标 : 学习结构体变量和结构体数组的定义和引用能力目标 : 掌握结构体的初步应用情感目标 : 通过结构体编程实践获得成 第 10 章结构体和枚举教案 一 授课题目 ( 教学章 节或主题 ) 10.1 结构体及结构体变量 10.2 结构体数组 二 教学时间安排 上课 2 学时 三 教学目的 要求 知识目标 : 学习结构体变量和结构体数组的定义和引用能力目标 : 掌握结构体的初步应用情感目标 : 通过结构体编程实践获得成就感, 提升 C 语言编程的兴趣 四 教学重点或难点 教学重点 : 结构体数组成员的引用 教学难点 :

More information

Microsoft PowerPoint - 10 模板 Template.pptx

Microsoft PowerPoint - 10 模板 Template.pptx 模板 Tempalte 泛型编程的需要 Why Templates? 设想你对整数类型实现了一个排序算法 : void sort(int *is,int n); 用该函数可以对实 复数或工资单排序吗? 模板可以复用源代码 - 泛型编程. inline void Swap( int &x, int &y){ int t = x; x = y; y =t; inline void Swap(double

More information

试卷格式

试卷格式 一 基本知识题 (10 分 ) 1.1. 已知定义 :int a=0; 请指出以下不会产生死循环的控制结构 A)for( ; ; ) if(a) break; B)for( ; ; a=0) if(a) break; C)for( ; ; ) if(a) continue; D)for( ; a=0 ; ) if(a) break; 1.2. 请指出正确描述实参和形参关系的命题 A) 如果实参是数组名,

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 3 章 lambda 表达式及其应用 lambda 表达式是 Java 8 提供的一种新特性, 它使得 Java 也能像 C# 和 C++ 语言一样进行简单的 函数式编程, 这不仅简化了某些通用结构的实现方式, 也大大增强了 Java 语言的表达功能 3.1 lambda 表达式简介 lambda 表达式是基于数学中的 λ 演算得名, 本质上就是一个没有方法名的匿名方法 例如, 有一个方法定义如下

More information

<4D F736F F D205A572D2D A1AAA1AAD4ACE7F42D43D3EFD1D4CAB5D1B5BDCCB3CC2E646F6378>

<4D F736F F D205A572D2D A1AAA1AAD4ACE7F42D43D3EFD1D4CAB5D1B5BDCCB3CC2E646F6378> 第 1 部分 Visual Studio 6.0 开发环境介绍 本书以 Visual C++ 6.0 作为 C 源程序的实践开发环境, 本章将首先介绍 Visual C++ 6.0 环境的基本操作, 包括 Visual C++ 6.0 的安装和启动,C 源程序的编辑 运行与调试 1.1 安装与启动 Visual C++ 6.0 MSDN Visual C++ 6.0 1.1 Microsoft Visual

More information

<4D F736F F D20CBB6CABFD1D0BEBFC9FAC8EBD1A7BFBCCAD4B4F3B8D92D383835B3CCD0F2C9E8BCC62E646F63>

<4D F736F F D20CBB6CABFD1D0BEBFC9FAC8EBD1A7BFBCCAD4B4F3B8D92D383835B3CCD0F2C9E8BCC62E646F63> 目录 I 考查目标... 2 II 考试形式和试卷结构... 2 III 考查内容... 2 IV. 题型示例及参考答案... 7 1 全国硕士研究生入学统一考试程序设计考试大纲 I 考查目标 全国硕士研究生入学统一考试计算机技术 软件工程专业学位硕士 程序设计 考试是为江苏大学招收以上硕士生设置的具有选拔性质的考试科目 其目的是科学 公平 有效地测试考生是否具备攻读计算机技术 软件工程专业学位硕士所必须的基本素质

More information

北京大学

北京大学 1 string 类 郭炜刘家瑛 北京大学程序设计实习 string 类 string 类是一个模板类, 它的定义如下 : typedef basic_string string; 使用 string 类要包含头文件 string 对象的初始化 : string s1("hello"); // 一个参数的构造函数 string s2(8, x ); // 两个参数的构造函数

More information

Unternehmens-Präsentation

Unternehmens-Präsentation JetSym STX 面向对象编程 坚德自动化技术 ( 上海 ) 有限公司修订日期 :2018 年 6 月 15 日 Revision date: June 15, 2018 概述... 面向过程 vs. 面向对象... 声明类... 实例化对象... 创建构造函数... 通过对象访问硬件... 指针... 对象列表... 继承... 对象的参数化... 面向过程 vs. 面向对象... 面向过程

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d =

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

期中考试试题讲解

期中考试试题讲解 一 选择题 ( 一 ) 1. 结构化程序设计所规定的三种基本结构是 C A 主程序 子程序 函数 B 树形 网形 环形 C 顺序 选择 循环 D 输入 处理 输出 2. 下列关于 C 语言的叙述错误的是 A A 对大小写不敏感 B 不同类型的变量可以在一个表达式中 C main 函数可以写在程序文件的任何位置 D 同一个运算符号在不同的场合可以有不同的含义 3. 以下合法的实型常数是 C A.E4

More information

幻灯片 1

幻灯片 1 第一类换元法 ( 凑微分法 ) 学习指导 复习 : 凑微分 部分常用的凑微分 : () n d d( (4) d d( ); (5) d d(ln ); n n (6) e d d( e ); () d d( b); ); () d d( ); (7) sin d d (cos ) 常见凑微分公式 ); ( ) ( ) ( b d b f d b f ); ( ) ( ) ( n n n n d f

More information

Static Enforcement of Security with Types

Static Enforcement of Security with Types 例题 1 一个 C 语言程序及其在 X86/Linux 操作系统上的编译结 果如下 根据所生成的汇编程序来解释程序中四个变 量的存储分配 生存期 作用域和置初值方式等方面 的区别 static long aa = 10; short bb = 20; func( ) { } static long cc = 30; short dd = 40; static long aa = 10; func(

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN: 978-7-302-13599-9, 红色封面答案制作时间 :2011 年 2 月 -5 月一 选择题 1. 以下数组定义中, 错误的是 :C)int a[3]=1,2,3,4; 2. 以下数组定义中, 正确的是 :B) int a[][2]=1,2,3,4; 3. 设有定义 int a[8][10];,

More information

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf (%d, & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9 201 201 21 ( ) 1. C pa.c, pb.c, 2. C++ pa.cpp, pb.cpp Compilation Error long long cin scanf Time Limit Exceeded 1: A 1 B 1 C 5 D RPG 10 E 10 F 1 G II 1 1 201 201 C 1 # include 2 int main ( void

More information

C/C++语言 - 分支结构

C/C++语言 - 分支结构 C/C++ Table of contents 1. if 2. if else 3. 4. 5. 6. continue break 7. switch 1 if if i // colddays.c: # include int main ( void ) { const int FREEZING = 0; float temperature ; int cold_ days

More information

没有幻灯片标题

没有幻灯片标题 第 2 章 C 语言的基本数据类型与表达 式 2. 1 C 语言的语法基础 2. 2 C 语言的基本数据类型 2. 3 常量和变量 2. 4 运算符与表达式 2. 5 数据类型转换 用 第 2 章 C 语言的基本数据类型与表达 2.1 C 语言的语法基础 2. 1. 1 C 语言字符集 式 C 语言的基本符号可分 4 个类, 归纳如下 : (1) 英文字母 : 大小写各 26 个, 共计 52 个

More information

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

Guava学习之CharSequenceReader

Guava学习之CharSequenceReader CharSequenceReader 类是以 CharSequence 的形式读取字符 CharSequenceReader 类继承自 Reader 类, 除了 remaining() hasremaining() 以及 checkopen() 函数之后, 其他的函数都是重写 Reader 类中的函数 CharSequenceReader 类声明没有用 public 关键字, 所以我们暂时还不能调用这个类

More information