C语言基础大全(基于千锋教育超详细教程)

C语言基础

1.第一个c语言程序

#include <stdio.h>
int main()
{
    printf("hello world");
    return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MDqWMCae-1649660664412)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330114102371.png)]

2.c语言类型以及语句

2.1.关键字

2.1.1数据类型相关关键字

%c ascll码

%d 输出本身

用于定于变量或者类型

类型 变量名 :

char 、short 、 int 、 long 、 float 、 double 、 struct 、 union 、 enum 、 signed 、 unsigned 、 void

1.char 字符型 用char定义的变量 是字符型变量 占一个字节

char ah = 'a'	=为赋值号

char ah = 'abc'  //错误写法

printf("c =%c\n", c);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LfWJfWBD-1649660664413)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330131522920.png)]

看一些各类型占用几个字节

#include <stdio.h>
int main()
{

    char a;
    short int b;
    int c;
    long int d;
    float e = 3.8f;
    double f = 3.8;
    printf("sizeof(a) =%d\n", sizeof(a)); // 1
    printf("sizeof(b) =%d\n", sizeof(b)); // 2
    printf("sizeof(c) =%d\n", sizeof(c)); // 4
    printf("sizeof(d) =%d\n", sizeof(d)); // 4
    printf("sizeof(e) =%d\n", sizeof(e)); // 4
    printf("sizeof(f) =%d\n", sizeof(f)); // 8

    return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bixRcS61-1649660664414)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330133001182.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oLL9YkqE-1649660664415)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330133737667.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-04NTFaz6-1649660664415)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330133914065.png)]

12.void关键字 空类型的关键字

char 、 int 、 float 、都可以定义变量

void 不能定义变量 ,没有void 类型的返回值

void是用来修饰函数的参数或者返回值,代表函数没有参数或者没有返回值

例子:

​ void fun(void){

​ }

代表fun没有返回值 fun函数没有参数

2.1.2储存类型相关关键字

register 、 static(静态) 、 const(常量) 、 auto 、 extern

1.register

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iY3dHlyG-1649660664416)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330134404256.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yayBSzuM-1649660664416)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330135001474.png)]

不能修饰数组 只能修饰 字符型 整形 ,不能修饰浮点型

2.static

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T5rRwBOg-1649660664416)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330135124942.png)]

3.const

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bedznn1N-1649660664417)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330135141163.png)]

4.auto

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m7V1iOsa-1649660664417)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330135155773.png)]

5.extern

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7QCrDoNY-1649660664418)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330135211706.png)]

2.1.3 控制语句相关的关键字

if 、 else 、 break 、 continue 、 for 、 while 、 do 、 switch 、 case 、goto 、default

2.1.4 其他关键字

sizeof 、 typedef 、 volatile

1.sizeof 测量字节数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jU53nDHn-1649660664418)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330135815570.png)]

2.typedef 重命名相关的关键字

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JaIdvkZF-1649660664419)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330135948633.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pB7iKiMD-1649660664420)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330140052763.png)]

#include <stdio.h>
// 1.short int a ;
// 2.short int INT16;
// 3.typedef short int INT16;
typedef short int INT16;
int main()
{
   
    short int b = 101;
    INT16 c = 111;
    printf("b=%d\n", b);
    printf("c=%d\n", c);
}
3.volatile 易改变得

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CLgvd5t4-1649660664421)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330140725983.png)]

Linux风格

stu_num

驼峰风格

StuNum

大小写敏感

int Num;

int num;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c1wUPTfo-1649660664421)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330141058966.png)]

2.2 数据类型

2.2.1 基本数据类型

char 、 short int 、 int 、 long int 、 float 、 double

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2lFQ4tgs-1649660664422)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330141235803.png)]

字符数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ONn79NK-1649660664422)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330141446722.png)]

整型数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bOykGvgW-1649660664422)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330151540535.png)]

十进制:以正常数字 1-9 开头 如457 789

八进制 :以数字0开头 如 0123

十六进制:以0x开头 如0x123

实型数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yixNa7fZ-1649660664423)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330152439833.png)]

格式化输出字符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FlTZ1xIG-1649660664423)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330152610482.png)]

十进制转二进制
将余数和最后的1从下向上倒序写 就是结果
例如302
302 2 = 151 余0
151 2 = 75 余1
75 2 = 37 余1
37 2 = 18 余1
18 2 = 9 余0
9 2 = 4 余1
4 2 = 2 余0
2 2 = 1 余0
1 2=0 余1
故二进制为100101110
再联想到二进制转十进制
二进制转为十进制的时候,先把二进制从高位(最左边的“1”)开始按从上到下的顺序写出 ,第一位就是最后的商 “2 2 = 1 余0 “,余数肯定是加零。其他位数如果有”1“(原来的余数),就先乘以”2“再加”1“。
下面就是从第一位开始乘以2加余数的方法算回去
例如 100101110
1…………0 2+1=1…………余数为1
0…………1 2+0=2………… 余数为0
0 …………2 2+0=4 ………… 余数为0
1 …………4x2+1=9……………… 余数为1
0…………9x2+0=18 ……………… 余数为0
1 …………18 2+1=37 …………余数为1
1…………… 37 2+1=75…………余数为1
1………………75 2+1=151………… 余数为1
0………………151 2+0=302 ………… 余0
所以得到十进制数302
另:1*2^8+0*2^7+0*2^6+1*2^5+0*2^4+1*2^3+1*2^2+1*2^1+0*2^0=302


八进制转十进制:整体顺序、小数点不变,个位乘8的0次方+十位乘8的1次方...=十进制得数,即可。小数部分从左到右乘8的负一次方开始,以此类推。
十进制转八进制:整体顺序、小数点不变,整数部分除8,余数倒着从左向右排,小数部分乘8,整数自左向右排。
2.2.2 构造类型

概念:由若干个相同或者不同类型的数据构成的集合,这种数据类型被称为构造类型

例:int a[10];

**数组 、 结构体 、共用体 、 枚举 **

2.2.3 类型转换
自动转换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ma0vnDsm-1649660664424)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330160210868.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ma66v1H9-1649660664424)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330161255695.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QSQWnlIU-1649660664426)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330161331099.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ADckVJb-1649660664426)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330163124854.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pV1ZBXXK-1649660664426)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330170226354.png)]

#include <stdio.h>
int main()
{
    // printf("%1f\n", 5.0 / 2);
    // return 0;

    int a = -8;
    unsigned int b = 7;
    if (a + b > 0)
    {
        printf("a+b >0\n");
    }
    else if (a + b < 0)
    {
        printf("a+b <0\n");
    }
    else
    {
        printf("a+b =0\n");
    }
    printf("a+b =%x\n", a + b);
    return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ot2Hsb21-1649660664427)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330170836685.png)]

  int a;
    float f = 5.8f;
    a = f;
    printf("a=%d", a);  //5
    return 0;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z8xqQU6z-1649660664427)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330171126176.png)]

强制转换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SeoN6a4J-1649660664428)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330171240716.png)]

 float x = 0;
    int i = 0;

    x = 3.6f;
    i = (int)x;
    printf("i=%d\n", i);

    printf("x=%1f\n", x);
    return 0;

说明:

​ 无论是强制类型转换或者是自动转换,都只是为了本次运算的需要,而对变量的数据长度进行临时性的转换,而不改变数据定义的类型以及它的值。

2.2.4 指针

2.3运算符

2.3.1 运算符

用算术运算符将运算对象(也称为操作数)连接起来的、符合C语法规则的式子,称为C算术表达式

运算对象包括常量,变量,函数等等…

​ 例如:a*b/c - 1.5 + ‘a’

2.3.2 运算符的分类

1、双目运算符:即参加运算的操作数有两个

​ 例 +

​ a+b

2.单目运算符:参加运算的操作数只有一个

++自增运算符 给变量值 +1

– 自减运算符

int a =10;

3.三目运算符: 即参加运算的操作数有三个

()?()😦)

2.3.3 算术运算符

/ + - % += -= *= /= %=

10%3 表达式的结果为 1

复合运算符:

​ a+=3 相当于 a= a+3

​ a*=6+8 相当于 a = a*(6+8)

2.3.4 关系运算符

(> 、 < 、== 、>= 、!=)

一般用于判断条件是否满足或者循环语句

2.3.5 逻辑运算符

1.&& 逻辑与

​ 两个条件都为真 。 则结果为真

​ if()(a>b)&&(a<c))

if(b<a<c)//这种表达式是错误的

2.|| 逻辑或

​ 两个条件至少有一个为真,则结果为真

​ if()(a>b) || (a<c))

3.! 逻辑非

​ if(!(a>b))

{

}

2.3.6 位运算符

16进制 除16得余

10进制 除10得余

-数的原码等于正数的原码加个符号位1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6IXIadxW-1649660664430)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330215822663.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KAh6ckPT-1649660664430)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330222009122.png)]

同一为一 ,有0为0.

按位与

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kZ4jHvEJ-1649660664431)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331101220336.png)]

两个都是0则结果为0.有一位为1 则结果为1.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cTBz1sIk-1649660664431)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331103149272.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fOiJzeEw-1649660664432)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331111304992.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V9JEDUXj-1649660664433)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331111334239.png)]

对于无符号数来说,补的就是0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OYluGwdY-1649660664434)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331111533674.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1pPVF56W-1649660664434)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331112145450.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZgfRRKNa-1649660664435)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220330220106137.png)]

2.3.7 条件运算符号

三目运算符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L4qTsmf6-1649660664436)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331113128233.png)]

2.3.8 逗号运算符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QM7CeaXp-1649660664436)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331113444463.png)]

2.3.9 自增自减运算符

​ i++ i–

运算符在变量的后面,在当前表达式中先用i的值,下条语句的时候i 的值改变

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JInPg1r2-1649660664437)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331130542718.png)]

++i --i

在当前表达式中先用i自增后的值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-67IeoJOz-1649660664437)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331130440749.png)]

2.3.10 运算符优先级及结合性

运算符优先级

​ 在表达式中按照优先级先后进行运算,优先级高的优于优先级低的先运算。

​ 优先级一样的按结合性来运算

int a;

a =2+5+3*4-6

运算符结合性

左结合性:从左往右计算

int a;

a=2+3.+9+10;

右结合性:从左往右运算

int a,b,c,d;

a=b=c=d=100;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GOQt5bl7-1649660664438)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331131245656.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DPM0ZHbD-1649660664438)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331131430949.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1kaRIZLw-1649660664439)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331131513416.png)]

2.4 控制语句相关关键字讲解

2.4.1 控制语句相关的关键字
1、if语句

形式 :

if( 条件表达式)
{ //复合语句 ,若干条语句的集合
	语句一:
	语句二;
	
	}

如果条件成立执行大括号里面的所有语句,不成立的话大括号里的语句不执行

2、

if(条件表达式)

 	{

}else{

}

if else 语句的作用是,如果if条件成立,执行if后面{}内的语句,否则执行 else 后的语句.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZcCmH3zM-1649660664439)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331132649328.png)]

2.switch 语句
switch (表达式) //表达式只能是字符型或者整型的(short int   int  long int)

{
	case 常量表达式1:
		语句1;
		break;
	case 常量表达式2:
		语句2;
		break;
	default: 语句3; break;
}
注意:break 的使用
2.4.2 循环控制语句
1、for()循环

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iLpR9fKV-1649660664440)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331151831680.png)]

 // for (int i = 0; i < 5; i++)
    // {
    //     if (i == 3)
    //     {
    //         printf("这个世界很奇妙\n");
    //         continue;
    //     };
    //     printf("i =%d\n", i);
    // };
    // return 0;
    int sum = 0;
    for (int i = 0; i <= 100; i++)
    {
        sum += i;
    };
    printf("1-100的和sum = %d", sum);
    return 0;

循环嵌套

//99乘法表
//循环嵌套
    int i, j;
    int sum = 0;
    for (i = 1; i <= 9; i++) //外层循环一次,内层循环一轮
    {
   
        for (j = 1; j <= i; j++)
        {
   

            printf("%d*%d=%d ", j, i, j * i);
        };
        printf("\n");
    };
2、while 循环

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HjO4MICU-1649660664440)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331161036106.png)]

//1-100的和
int i = 1;
    int sum = 0;
    while (i <= 100)
    {
   
        sum += i;
        i++;
    }
    printf("sum=%d\n", sum);
    return 0;

do{} while(); //至少执行一次

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UGlqdyxq-1649660664441)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331161408879.png)]

int i = 1;
    int sum = 0;
    do
    {
   
        sum += i;
        i++;
    } while (i <= 100);
    printf("sum=%d\n", sum);
    return 0;

对于循环来说

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DN4iJgQJ-1649660664441)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331161826494.png)]

3、goto

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BEBYaXx1-1649660664442)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331162134158.png)]

程序经量少使用goto

4.水仙花数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EiT83G1e-1649660664442)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331162241934.png)]

#include <stdio.h>
int main()
{
   
    int a, b, c;
    int i;
    for (i = 0; i <= 999; i++)
    {
   
        a = i / 100;      //百位
        b = i % 100 / 10; //十位
        c = i % 10;       //各位

        if (i == a * a * a + b * b * b + c * c * c)
        {
   

            printf("水仙花数为=%d", i);
        };
    };

    return 0;
}
#include <stdio.h>
int main()
{
   
    /*
    任意给出一个年月日、判断是一年的第几天
    闰年算法:能被4整除且不能被100整除,或者 能被400整除
    如:2012 5 10 是这一年的第131天
    提示switch
    */
    int year, month, day;
    int sum;
    printf("please input year month day:\n");
    scanf_s(" %d %d %d", &year, &month, &day);
    switch (month)
    {
   
    case 1:
        sum = day;
        break;
    case 2:
        sum = 31 + day;
        break;
    case 3:
        sum = 31 + 28 + day;
        break;
    case 4:
        sum = 31 + 28 + 31 + day;
        break;
    case 5:
        sum = 31 + 28 + 31 + 30 + day;
        break;
    case 6:
        sum = 31 + 28 + 31 + 30 + 31 + day;
        break;
    case 7:
        sum = 31 + 28 + 31 + 30 + 31 + 30 + day;
        break;
    case 8:
        sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + day;
        break;
    case 9:
        sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + day;
        break;
    case 10:
        sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day;
        break;
    case 11:
        sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day;
        break;
    case 12:
        sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day;
        break;
    default:
        sum = 0;
        printf("你输入月份有误");
        break;
    }
    
    if (month > 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
    {
   
        sum += 1;
    }
    printf("%d %d %d 是一年中的第%d 天\n", year, month, day, sum);
    return 0;
}

3.数组

3.1数组的概念

数组是若干个相同类型的变量在内存中有序存储的集合

int a[10]; //定义了一个整型的数组 a, a是数组的名字,数组中有10个元素,每个元素的类型都是 int 类型,而且在内存中连续存储。

这十个元素分别是a[0] a[1] … a[9]

a[0]~a[9]在内存中连续的顺序存储

3.2数组的分类

3.1.1按照元素的类型分类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m3aZo3sV-1649660664443)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331172910862.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BfdrmL5Q-1649660664444)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331173159764.png)]

3.2.2 按维数分类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ccDgTN3Y-1649660664444)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331173359170.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TeXmYZtY-1649660664445)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331173419099.png)]3.3数组的定义

定义一个数组,在内存里分配空间

3.3.1 一维数组的定义

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TIOVYigU-1649660664445)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331174540507.png)]

3.3.2 二维数组的定义

格式:

​ 数据类型 数组名 [行的个数] [列的个数];

​ int a [4] [5];

​ 定义了20个int 类型的变量 分别是

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aiCUi4W7-1649660664446)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220331180506119.png)]

因为一个整数占4个字节 可以按照这样计算

二维数组可以不指定行数,但是必须指定列数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7lpGEwRB-1649660664447)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220401093931210.png)]

3.4数组的初始化

定义数组的时候,顺便给数组的元素赋初值,及开辟的内存空间同时并且给元素赋值。

3.4.1一维数组的初始化

a 、 全部初始化

int a[5] = {2,4,7,8,5};

b 、 部分初始化

​ int a[5] = {2,4,3};初始化赋值不够后面补0

​ a[0] = 2 a[1] = 4 a[2] =3 a[4] =0 a[5] =0

注意:只能省略后面的元素,可以不初始化,不能中间的不初始化。

3.4.2 二维数组的定义并初始化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nYybKbXP-1649660664447)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220401094452739.png)]

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

3.5数组元素的引用方法

3.5.1 一维数组元素的引用方法

数组名[下标]; //下标代表数组元素在数组中的位置

int a[5];

3.5.2 二维数组元素的引用方法

数组名[行下标] [列下标]

int a [4] [5]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y8vKuj7W-1649660664448)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220401100950995.png)]

3.5.3 字符数组

char c1[] = {‘c’,‘a’,‘g’,‘r’};

char c2[] = “c prog”;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-et9IrVqY-1649660664448)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220401102245644.png)]

[数组是若干个相同类型变量的集合][]

两道练手题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HV98oiTq-1649660664448)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220401112245495.png)]

#include <stdio.h>
int main()
{
   
    int i;
    int sum = 0;
    int year, month, day;
    int buf[12] = {
   31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    printf("please input year month day\n");
    scanf_s("%d %d %d", &year, &month, &day);
    if (day >= 30 || day < 1)
    {
   
        printf("你输入的信息有误");
    }
    else
    {
   

        for (i = 0; i < month - 1; i++)
        {
   
            sum += buf[i];
        }
        sum += day;
        if (month > 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
        {
   
            sum += 1;
        }
        printf("sum=%d\n", sum);
    }
    return 0;
}

打字游戏

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4nmB995c-1649660664449)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220401131148819.png)]

#include <stdio.h>
#include <conio.h>
#include <time.h>
void help(void)
{
   

    printf("\n******************************************");
    printf("\n* 输入过程中无法退出!                     *");
    printf("\n* 请按住所给字母敲击键盘!                 *");
    printf("\n* 请按任意键开始测试,按下首字母时候开始计时!");
    printf("\n* 输入错误则以_表示                        ");
    printf("\n******************************************\n\n");
}
int main()
{
   
    char ch;
    char str[51] = "";
    int i;

    int count;

    time_t start_time, end_time; // typedef long long time_t
    while (1)
    {
   
        system("cls"); //清除屏幕
        help();
        ch = _getch();
        srand(time(NULL));
        for (i = 0; i < 50; i++)
        {
   
            str[i] = rand() % 26 + 'a'; // rand()产生一个随机数,26个字母 对26取余  是一个0-25的随机数
        }
        str[50] = "\0";

        printf("%s\n", str);
        count = 0;
        for (i = 0; i < 50; i++)
        {
   
            ch = _getch();
            if (i == 0)
            {
   
                start_time = time(NULL);
            }
            if (ch == str[i])
            {
   
                count++;
                printf("%c", ch);
            }
            else
            {
   

                printf("_");
            }
        }
        end_time = time(NULL);
        printf("\n正确率: %d%%\n", count * 100 / 50);
        printf("用时%d秒", (long int)end_time - start_time);
        //当我输入空格重新开始,输入其他无效,输入esc退出
        while (1)
        {
   
            ch = _getch();
            if (ch == ' ')
            {
   
                break;
            }
            if (ch == 27)
            {
   
                return 0;
            }
        }
    }

    return 0;
}

4.函数

4.1函数的概念

函数是c语言的功能单位,实现一个功能可以封装一个函数来实现。

定义函数的时候一切以功能为目的,根据功能去定函数的参数和返回值。

4.2函数的分类

1、从定义的角度分类(即函数是谁实现的)

  1. 库函数(c库实现的)
  2. 自定义函数(程序员自己实现的函数)
  3. 系统调用

2、从参数角度分类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7QzEGTfq-1649660664449)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220401141601267.png)]

3 、从返回值的角度分类

1.带返回值的函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GGJc1oAs-1649660664450)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220401142237504.png)]

2.没有返回值的函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PmDH8tQN-1649660664450)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220401144514427.png)]

4.3函数的定义

什么叫做函数的定义呢?即函数的实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-61NS3hK7-1649660664450)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402095635167.png)]

不能再函数体内定义另一个函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eOw6p5hx-1649660664451)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402095940734.png)]

4.4函数的声明

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4kz3tgEL-1649660664451)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402101003626.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B52kLNzI-1649660664452)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402101442600.png)]

声明就是在一个函数中调用另一个函数

1.直接声明法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nVxLDqOF-1649660664452)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402101510543.png)]

#include<stdio.h> //这种类型是C库文件的声明

#include “4_3.h” //是对程序员创建的程序的声明

2.间接声明法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t6jGkYGQ-1649660664452)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402101907638.png)]

3.分文件声明法

将函数都写在一个.c中,使用头文件.h来进行声明,然后再其他文件中就可以直接使用了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T7ZFG7pX-1649660664453)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402103034664.png)]

4.5 函数的调用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N4Fpe71r-1649660664453)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402103315924.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JVIwclJ4-1649660664454)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402103508303.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RtmHhF67-1649660664454)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220402103410739.png)]

4.6函数的总结

在定义函数的时候 ,关于函数的参数和返回值是什么情况,完全取决于函数的功能。

使用函数的好处?

1、定义一次,可以多次调用,减少代码的冗余度。

2、使咱们的代码,模块化更好,方便程序调试,而且阅读方便。

递归函数

#include<stdio.h>
int fun(int x){
   
    int p;
    if(x==0||x==1)p=3;
    else p=x-fun(x-2);
    return p;
}
int main(int argc, char const *argv[])
{
   
    printf("%d\n",fun(12));
    return 0;
}
//fun(7)=7-fun(5)=7-(5-fun(3))=7-(5-(3-fun(1)))=7-(5-(3-3))=7-5=2 ”

4.7 变量的存储类别

4.7.1 内存的分区:

1、内存:物理内存、虚拟内存

​ 物理内存:实实在在存在的存储设备

​ 虚拟内存:操作系统虚拟出来的内存

​ 操作系统会在物理内存和虚拟内存之间做映射。

在32位平台下,每个进程的寻址范围是4G,0x00 00 00 00 -0xff ff ff ff

在写应用程序,咱们看到的都是虚拟地址。

2、在运行程序的时候,操作系统会将  虚拟内存进行分区。

  1. 在动态申请内存的时候,在堆中开辟内存。

  2. 主要存放局部变量。

  3. 静态全局区

    1. 未初始化的静态全局区

      静态变量(定义变量的时候,前面加static修饰),或全局变量,没有初始化的,存在此区

    2. 初始化的静态全局区

      全局变量、静态变量、赋过初值的,存放此区

  4. 代码区

    存放咱们的代码。

  5. 文字常量区

    存放常量的。

4.7.2 普通的全局变量

概念:

​ 在函数外部定义的变量

	int num =100; //num 就是一个全局变量
	int main(){
	
		return 0;
	}

作用范围:

全局变量的作用范围,是程序所有地方。

​ 只不过用之前需要声明。声明方法 extern int num;

​ 注意声明的时候,不要赋值。

生命周期:

​ 程序运行的整个过程,一直存在,直到程序结束。

注意:定义普通的全局变量的时候,如果不赋初值,它的默认值为0

4.7.3 静态的全局变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6E6fWh55-1649660664454)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220403164550691.png)]

#include<stdio.h>
void fun(void) {
   
	static int num = 3; //这就是静态局部变量的好处 ,只执行一次,下次不参与赋值了,此处
	//	如果不用static修饰,则在下次执行这个方法的是和num 还是会被赋值。
	//不用静态修饰的在内存空间的分配中是同一个
	int num1 = 4;
	num++;
	num1++;
	printf("num = %d\n", num);
	printf("num1 = %d\n", num1);
}

int main() {
   
	fun();
	fun();
	fun();
	return 0;
}
4.7.4 普通的局部变量

概念:

​ 在函数内部定义的,或者复合语句中定义的变量

int main(){
   
    int num; //局部变量
    {
   
        int a;//局部变量
    }
}

作用范围:

​ 在函数中定义的变量,在函数中有效。

​ 再复合语句中定义的,再复合语句中有效。

生命周期:

​ 在函数调用之前,局部变量不占用内存空间,调用函数的时候,才为局部变量开辟空间,函数结束了,局部变量就释放了。

在复合语句中的定义亦如此。

#include<stdio.h>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值