复习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
0 0
原创粉丝点击