复习C语言———《C Prime Plus(第六版)》 第8章~第12章
来源:互联网 发布:惊艳口红推荐知乎 编辑:程序博客网 时间:2024/06/05 07:51
复习C语言———《C Prime Plus(第六版)》 第8章~第12章
第8章 字符输入/输出和输入验证
小结: 如何重定向输入和输出
把输出重定向至文件: >
prog >file1
把输入重定向至文件: <
prog <file2
组合重定向:
prog <file2 >file1
prog >file1 <file2
这两种形式都是把file2作为输入、file1作为输出
while (getchar() != '\n') continue; //跳过缓冲区的其他字符
第9章 函数
9.1.2 分析程序
1.函数原型(function prototype)
2.函数调用(function call)
3.函数定义(function definition)
void starbar(void);
第1个void是函数类型 第2个void表明函数不带参数 此为签名
9.3.2 递归的基本原理
第1, 每级函数调用都有自己的变量。就是说, 第一级的参数和第二级的参数不同, 所以程序创建了多个单独的变量, 每个变量名都是n, 但各自值不相同
第2, 每次函数调用都会返回一次
第3, 递归函数中位于递归调用之前的语句,均按被调函数的顺序执行
第4, 递归函数中位于递归调用之后的语句,均按被调函数相反的顺序执行
第5, 虽然每级递归都有自己的变量, 但是没有拷贝函数的代码
第6, 递归函数必须包含能让递归调用停止的语句
小结:
地址运算符: &
后跟一个变量名时, &给出该变量的地址
解引用运算符: *
后跟一个指针名或地址时, *给出储存在指针指向地址上的值
小结: 名称、地址、值
普通变量把值作为基本变量, 把地址作为&运算符获得的派生量
指针变量把地址作为基本变量, 把值作为*运算符获得的派生量
第10章 数组和指针
1.数组与指针的关系
#include <stdio.h>int main(void){ int num[3][4] = {{10, 11, 12, 13}, {20, 21, 22, 23}, {30, 31, 32, 33}}; int num1[3] = {3, 4, 7}; int *ptr_1; int (*ptr_2)[3]; printf("num: %p\n", num); printf("num[0]: %p\n", num[0]); printf("num[0][0]: %p\n", &num[0][0]); printf("num: %d\n", **num); printf("num[0]: %d\n", *num[0]); printf("num[0][0]: %d\n", num[0][0]); ptr_1 = num1; ptr_2 = &num1; printf("*ptr_1: %d\n", *ptr_1); printf("**ptr_: %d\n", **ptr_2); return 0;}
2.指针指向变量时 地址与值的关系
#include <stdio.h>void swap(char *x, char *y){printf("%p\n",x); //指针的值 同数组s1的地址printf("%p\n",&x); //指针自身的地址printf("%p\n",y); //指针的值 同数组s2的地址printf("%p\n",&y); //指针自身的地址x=y; // 执行后指针x和指针y一样,指针的值变化了,即指向的地址都转为s2 //*x=*y,只能让s1的首元素被赋值为s2的元素printf("%s\n",x);printf("%s\n\n",y);}int main(){char s1[]="abc", s2[]="123";printf("%p\n",s1); //数组的地址printf("%p\n\n",s2);swap(s1, s2); printf("%p\n",s1); //数组的地址printf("%p\n\n",s2);printf("%s, %s\n", s1, s2); //不改变的原因是: 仅仅是指针变了 地址和地址上的值都未变return 0;}
double ptr; //double类型的指针double arr[3]; //double类型的数组ptr = arr; //令ptr指向arrptr; //arr的地址*ptr; //arr首元素的值&ptr; //ptr自身的地址
3.VLA
#include <stdio.h>#include <windows.h>int main(void){ int num; int i; int vla[num]; printf("Input the num\n"); while (scanf("%d", &num)!=1) { printf("Error\n"); printf("Input again\n"); while(getchar()!='\n') continue; } printf("Confirm: num:%d \n", num); printf("Input the data\n"); for (i=0; i<num; i++) { printf("Now Input the number of %d num:", i+1); while (scanf("%d", &vla[i])!=1) { printf("Error\n"); printf("Input again\n"); while(getchar()!='\n') continue; } printf("testVLA: %p\n",&vla[i]); } for (i=0; i<num; i++) printf("%d ", vla[i]); system("pause"); return 0;}
VLA是自动储存类别、不能使用static和extern储存类别说明符、不能初始化它们。
小结: char类型数组 指针 的声明、赋值初始化、输入
char arr[] ; char arr[N]; char *ptr;声明 不可(初始化可) 可(初始化可) 可(初始化可)赋值(=) 不可 不可 可输入 不可 可 不可(malloc()可)
输入是指scanf()
第11章 字符串和字符串函数
Ⅰ.字符串数组与指针
1.初始化数组把静态储存器的字符串拷贝到数组中,而初始化指针只把字符串的地址拷贝给指针
2.如果不修改字符串,不要用指针指向字符串字面量
char *ptr = "Klingon"; char arr[] = "Klingon";ptr[0] = 'F' ;//前者也许可以修改, 前加const不可修改arr[0] = 'F' //不可修改
3.gets() fgets() gets_s() && puts() fputs()
(1) gets() & puts() 丢弃换行符 结尾添加\0 & 添加换行符
(2) fgets() & fputs() 不丢弃换行符 结尾添加\0 & 不添加换行符
(3)fgets(): 读取整行输入并用空字符代替换行符,或者读取一部分输入, 并丢弃其余部分
#include <string.h>char * v_s_gets(char *, int);char * str_gets(char * str, int n);char * v_s_gets(char * str, int n){ char * val; int i = 0; val = fgets(str, n, stdin); while (val) //vvv { while (str[i] != '\n' && str[i] != '\0') i++; if (str[i] == '\n') str[i] = '\0'; else while (getchar() != '\n') continue; return val; }}char * str_gets(char * str, int n){ char * val; char * seek; val = fgets(str, n, stdin); if (val) { seek = strchr(str, '\n'); if (seek) *seek = '\0'; else while(getchar() != '\n') continue;; } return val;}
Ⅱ.字符串函数
strlen()strcat() //连接两个字符串strcmp() strncmp() //比较两个字符串strcpy() strncpy() //复制字符串
Ⅲ.字符串排序
void select_sort(char *strings[], int);void select_sort(char *strings[], int num){ char *temp; int top; int seek; for (top = 0; top < num - 1; top++) for (seek = top + 1; seek < num; seek++) if (strcmp(strings[top], strings[seek]) > 0) { temp = strings[top]; strings[top] = strings[seek]; strings[seek] = temp; }}void select_sort(double ave[], int);void select_sort(double ave[], int num){ double temp; int top; int seek; for (top = 0; top < num - 1; top++) for (seek = top + 1; seek < num; seek++) if ((ave[top] - ave[seek]) > 0) { temp = ave[top]; ave[top] = ave[seek]; ave[seek] = temp; }}
第12章 储存类别、链接和内存管理
Ⅰ.小结
Ⅱ.内存分配
malloc
double *ptr;int size = 31;ptr = (double *)malloc(sizeof(double) * size); //ptr指向一个拥有31个double类型的数组
动态分配使用后要free()释放掉内存
程序把它可用的内存分为3个部分:
1.具有外部链接、内部链接和无链接的静态变量使用
2.自动变量使用
3.动态内存分配
程序把静态对象、自动对象和动态分配的对象储存在不同的区域。
Ⅲ.ANSI C类型限定符
类型、存储类别、限定类型来形容一个变量
constvolatilerestrict
- 复习C语言———《C Prime Plus(第六版)》 第8章~第12章
- 复习C语言———《C Prime Plus(第六版)》 第1章~第7章
- 复习C语言———《C Prime Plus(第六版)》 第13章~第17章
- c++Prime Plus 第六版第18章复习题第7题答案有误..
- C.Primer.Plus(第六版)第12章 队列模拟
- C.Primer.Plus(第六版)第12章 编程练习
- 【C++】学习笔记十四——C++ primer plus第六版第4章编程练习
- C++prime plus第6版第三章要点
- C.Primer.Plus(第六版)第10章 编程练习
- C.Primer.Plus(第六版)第11章 编程练习
- C Primer Plus(第6版)第六章答案
- C.Primer.Plus(第六版)第13章 编程练习
- C.Primer.Plus(第六版)第14章 编程练习
- C.Primer.Plus(第六版)第15章 编程练习
- C.Primer.Plus(第六版)第16章 编程练习
- C.Primer.Plus(第六版)第17章 编程练习
- C Prime plus 第六章习题
- c plus plus 第3章练习
- openvas更改监听IP地址
- 6U OpenVPX单板计算机 xPower6110
- UDP通信发送数据的问题
- JavaScript 语法
- Android 通知栏 PendingIntent.getActivity(context, requestCode, intent, flags);参数详解
- 复习C语言———《C Prime Plus(第六版)》 第8章~第12章
- (c++)一个数如果恰好等于它的因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出N之内的所有完数,并按下面格式输出其因子
- 【JS】函数 Number()、parseInt()、parseFloat()以及Number.toFixed(x) 、 Number.toPrecision(x) 、 Math.Round(x)
- Android HTTPS、TLS版本支持相关解决方案
- 【BZOJ 3545】 [ONTAK2010]Peaks 最小生成树+kruskal重构树
- Gradle Plugin和Gradle版本
- 尚硅谷java学习笔记——11.java多线程
- 【HDU 2039】三角形 水
- struts2中的constant介绍之struts.objectFactory与spring的整合