C语言复习笔记

简介: C语言复习笔记

C语言复习笔记


一.C语言结构及其规范

1.组成:C语言由若干头文件和函数组成

主函数不可少,最新c标准中类型为int。

2.C语言的良好习惯

语句:一个说明或一个语句占一行,语句要有明显缩进,按一下tab键。

符号:括号成对写,成对删,语句末尾要有分号,所有符号为英文半角符号。

3.//注释一行 /* */注释多行

要记得写一些注释

二.C语言中的数据类型

1.标识符

组成:0到9的数字,26个大小写字母,下划线_

注意:只能字母或下划线开头;

长度不宜太长,有些版本规定前八位有效;

严格区分大小写;

最好要有意义,便于阅读 ;

如:word_max_length;

C语言的关键字不能作为标识符。

2.变量和赋值

注意:int a=b=c=5;×

int a,b,c; a=b=c=5; √

3.基本数据类型

基本类型:整型,字符型,实型(单精度浮点型,多精度浮点型)

构造类型:枚举类型,数组类型,结构体类型,共用体类型

指针类型

空类型

3.输出语句

printf("输出格式符",输出项);

格式符的个数要与变量、常量或者表达式的个数一一对应

%f 输出六位小数

输出十位小数%.10lf

4,常量

整型常量,实型常量,字符常量,字符串常量

5.自动转换类型

占字节少的数据类型可以自动转换为占字节大的数据类型

6.强制类型转换

形式为:(数据类型)(表达式)

不改变原数据,需要加括号,不遵循四舍五入

三.C语言运算符

1.类型: 算术运算符;

赋值运算符;

关系运算符;

逻辑运算符;

三目运算符。

2.除法运算

两整数除,小数省略,有一小数,结果为小数。

3.取余运算

符号由被除数决定;

只适合整数的运算。

4.自增运算符,自减运算符

++a; --a;先运算再取值

a--;a++;先取值再运算

5.赋值运算符

有右结合性

复合赋值运算符 a+=a

a*=5

a-=5

a%=5

a/=5

6.关系运算符

7.逻辑运算符

&& 与 ||或 !非

8.三目运算符

表达式1?表达式2:表达式3

表达式1为真,执行表达式2,为假,执行表达式3。

9.表达式优先级

括号优先级最高;

!正负号自增自减其次;

先乘除取余后加减;

关系运算分两级==,!=是第二级;

与&&高于或||;

三目运算符;

复合赋值在最后。

四.C语言结构语句

1.分支结构

简单if语句

if(表达式){

}

if-else语句

if(表达式)

{

}

else

{ }

多重if-else语句

if(表达式1)

{ }

else if(表达式2)

{

}

else

{

}

if-else可以进行嵌套

2.循环语句

while循环

while(表达式)

{ }

要改变循环变量的值,避免出现死循环。

do-while循环

do{

}while(表达式);

注意此处的分号

for循环

for(表达式1;表达式2;表达式3)

{ }

表达式一二三都可以省略,但是两个分号不可以省略

不知道循环次数用while和do-while,知道用for

新的_Bool类型

在编程中,表示真或假的变量被称为布尔变量(boolean variable);

该类型变量只能存储1(真)或2(假)

如将其他数赋值给_Bool类型变量,该变量会被设置为1;

循环也可以嵌套,如冒泡排序

#include<stdio.h> 
int main() 
{ 
    printf("请输入十个数字;\n"); //输入十个数字 
    int series[50]; int i,j,charge; 
    for(i=0;i<10;i++)  
        scanf("%d",&series[i]);  
    for(i=9;i>=0;i--) { 
        for(j=0;j<=i;j++) { 
            if(series[j]<series[j-1]) { 
                charge=series[j-1]; series[j-1]=series[j]; series[j]=charge; } 
        } 
    } 
    printf("该数列从小到大排列后:\n"); for(i=0;i<10;i++) //输出排列后的数组 { if(i<9)                 
    printf("%d,",series[i]); else printf("91"); } 
    return 0; 
}

3.break,contine,goto

break可以跳出当前循环,continue结束本次循环继续下一次循环;

goto也可以跳出循环,多层循环可以直接跳出。

4.swtich语句

swtich(表达式){ case 1:

case 2:

default:

}

case后的多个语句不用{};

swtich后的表达式只能是整型和字符型;

default可以省略。

五.函数

1.函数的分类

函数可分为库函数和用户自定义函数;

函数可分为有返回值函数和无返回值函数;

按照主调函数和被调函数有无数据传输可分为无参函数和有参函数。

2.自创函数

[数据类型说明]函数名([参数])

{

return0;

}

3.函数调用

函数名([参数]);

4.形参和实参

形参是定义函数时用的参数,只在函数内部有效,返回主调函数后不再使用;

实参是在调用时传递该函数的参数;

实参和形参在数量上,类型上必须严格一致。

5.函数的返回值

注意:1.函数返回值的类型应与函数类型保持一致;

2.有返回值的函数只能返回一个值;

3.返回值是指针类型,函数就是指针函数。

6.递归函数

即一个函数在函数体内调用它自身。

如:n的阶乘

#include<stdio.h>
int factorial(int n)
{
    int result;
    if (n<0)
    {
        printf("输入错误\n");
        return 0;
    }
    else if(n==0||n==1)
    {
        result=1;
    }
    else
    {
        result=factorial(n-1)*n; 
    }
    return result;
}
int main()
{
    int x;
    printf("请输入你要算的阶乘:\n");
    scanf("%d",&x);
    printf("%d的阶乘是%d",x,factorial(x));
    return 0;
}

递归函数必须要结束条件。

7.局部与全局

全局变量在函数外部定义,不属于任何一个函数

8.变量存储类别

1. 分为静态存储方式和动态存储方式

动态存储区存放的变量根据程序运行的需要而建立和释放

2.存储类别分为四类:自动(auto)

静态(static)

寄存器的(register)不能定义多个寄存器变量,只有局部自动变量和形参可以作为寄存器变量

外部的(extern)

9.内部函数和外部函数

不能被其他源文件调用的函数是内部函数,用static来定义

static [数据类型]函数名[参数]

能被其他源文件调用的是外部函数

extern [数据类型]函数名[参数]

不指定,默认为外部函数

六.数组

1.数组概念:一块连续的,大小固定并且里面的数据类型一致的内存空间。

2.数组声明:数据类型 数组名称[长度];

3.数组初始化的三种形式:

数据类型 数组名称[长度n] = {元素1,元素2…元素n};

数据类型 数组名称[] = {元素1,元素2…元素n};

数据类型 数组名称[长度n]; 数组名称[0] = 元素1; 数组名称[1] = 元素2; 数组名称[n-1] = 元素n;

4.在声明数组后没有进行初始化的时候,静态(static)和外部(extern)类型的数组元素初始化元素为0,自动(auto)类型的数组的元素初始化值不确定。

5.数组的遍历

int arr[3]={1,2,3};
int i;
for(i=0;i<3;i++)
{
    printf("%d\n",arr[i]);
}
return 0;

要避免越界访问

数组作为函数参数

1、整个数组当作函数参数,即把数组名称传入函数中 2、数组中的元素当作函数参数,即把数组中的参数传入函数中

冒泡排序

#include<stdio.h> 
int main()
{
    printf("请输入十个数字;\n");         //输入十个数字 
    int series[50];
    int i,j,charge;
    for(i=0;i<10;i++) 
    {
        scanf("%d",&series[i]);
    }
    for(i=9;i>=0;i--)
    {
        for(j=0;j<=i;j++)
        {
            if(series[j]<series[j-1])
            { 
            charge=series[j-1];
            series[j-1]=series[j];
            series[j]=charge;
            } 
        }
    }
    printf("该数列从小到大排列后:\n");
        for(i=0;i<10;i++)              //输出排列后的数组 
    {
        if(i<9)
        printf("%d,",series[i]);
        else                     
        printf("91");
    }
    return 0;
}

数组的查找功能

如该程序

#include<stdio.h>
int getIndex(int arr[5],int value)
{
    int i;
    for(i=0;i<5;i++)
    {
        if(arr[i]==value)
        {
            return i;
        }
    }
    return -1;
}
int main()
{
    int arr[5]={22,45,23,12,67};
    int value=12;
    int index=getIndex(arr,value);
    if(index!=-1)
    {
        printf("%d在数组中存在,下标为%d",value,index);
    }
    else
    {
        printf("%d在数组中不存在",value);
    }
    return 0;
}

字符串与数组

有两种格式:

1、char 字符串名称[长度] = "字符串值";

2、char 字符串名称[长度] = {'字符1','字符2',...,'字符n','\0'};

第一种可以写中文,第二种不可以

10.一些#include<string.h>下的函数

1.strlen()获取字符串的长度,在字符串长度中是不包括‘\0’而且汉字和字母的长度是不一样的。

2.strcmp()在比较的时候会把字符串先转换成ASCII码再进行比较,返回的结果为0表示s1和s2的ASCII码相等,返回结果为1表示s1比s2 的ASCII码大,返回结果为-1表示s1比s2的ASCII码小。

3.strcpy()拷贝之后会覆盖原来字符串且不能对字符串常量进行拷贝。

4.strcat在使用时s1与s2指的内存空间不能重叠,且s1要有足够的空间来容纳要复制的字符串

5.strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串

6.strchr()在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。

11.多维数组

数据类型 数组名称常量表达式1...[常量表达式n];

初始化方式:

1、数据类型 数组名称常量表达式1...[常量表达式n] = {{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};

2、数据类型 数组名称常量表达式1...[常量表达式n]; 数组名称下标1...[下标n] = 值;

注意:

1、采用第一种始化时数组声明必须指定列的维数。因为系统会根据数组中元素的总个数来分配空间,当知道元素总个数以 及列的维数后,会直接计算出行的维数;

2、采用第二种初始化时数组声明必须同时指定行和列的维数。

12.多维数组的遍历

#include<stdio.h>
int main()
{
    int num[3][3]={{1,2,3},{4,5,6},{7,8,9}};
    int i,j;
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("num[%d][%d]=%d\n",i,j,num[i][j]);
        }
    }
    return 0;
}

13.数组的输出输入

可以用 gets();

puts();

可以用%s整体输出

七.随机数

1.rand 函数 和 srand 函数 在C语言中比较常用的随机函数是 rand 函数,它可以随机的产生 0 ~ rand_max 的随机数,定义类型不同最大值也不同,rand 函数包含在头文件stdlib.h中。

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int a=rand();
    printf("%d",a);
    return 0;
}

rand 在系统启动之后就是一个定值。

要想每次产生的随机数不一样,要用到 srand 函数。

srand() 函数原型是:

void srand(unsigned int seed);

seed相同,产生的随机数相同,为了让随机数随机,要用时间做种子。

srand(time(NULL))

srand((unsigned int)time(NULL));//我们在使用rand和srand时,主要使用的就是这一种初始化方法!! 如果仍然觉得时间间隔太小,可以在(unsigned)time(0)或者(unsigned)time(NULL)后面乘上某个合适的整数。 例如,srand((unsigned)time(NULL)*10) time的参数传NULL表示不需要经过参数获得到的time_t数据

2.随机数产生的方法

头文件

#include<stdlib.h>

#include<time.h>

初始化的两种方法

srand((unsigned int)getpid())

srand((unsigned int)time(NULL))

产生一个1到100的数

int num = rand() % 100 + 1;

八.指针

1.指针类型

指针是表示地址信息的数据类型

地址可以用10进制,8进制,16进制表示

%x 十六进制

%o 八进制

%lu 无符号长整型

2.指针变量的格式

类型说明符 *指针变量名[=初值];

类型说明符是指该指针变量指向的变量的数据类型

可以在定义时对指针赋初值

NUll表示指针不指向任何单元

3.辨析&和*

这两个符号有右结合性,这两个是一种相反的运算

*后只能是指针变量

4.可以对指针加减乘除,可以交换两个指针的指向

5.指向指针变量的指针

int a=10,*p,**q;

   p=&a;

   q=&p;

6.指针和数组

p++表示指向当前元素的下一个元素

可以用指针遍历数组

#include<stdio.h>
int main()
{
    int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},*p;
    int i,j;
    for(p=a[0];p<a[0]+12;p++)
    {
        if((p-a[0]%4)==0)
        printf("\n");
        printf("%-4d",*p);
    }
    return 0;
}


相关文章
|
7月前
|
存储 人工智能 算法
【C语言】自学终极笔记
【C语言】自学终极笔记
108 0
|
4月前
|
测试技术 C语言 C++
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
|
4月前
|
存储 C语言
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
|
6月前
|
C语言
|
6月前
|
C语言
|
7月前
|
C语言
C语言(指针详解)重点笔记:指针易错点,都是精华
C语言(指针详解)重点笔记:指针易错点,都是精华
78 0
|
存储 编译器 C语言
C语言笔记第03章:数组(四)
C语言笔记第03章:数组
97 0
|
编译器 C语言 索引
C语言笔记第03章:数组(一)
C语言笔记第03章:数组
106 0
|
7月前
|
NoSQL Redis C语言
|
C语言
C语言初阶 牛客网刷题笔记(将持续更新..)
C语言初阶 牛客网刷题笔记(将持续更新..)
C语言初阶 牛客网刷题笔记(将持续更新..)