IE盒子

搜索
查看: 131|回复: 0

【C语言学习笔记】(近万字!)

[复制链接]

2

主题

7

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2023-1-25 03:15:25 | 显示全部楼层 |阅读模式
初始C语言
1.1第一个程序:


1.2数据类型:
char        //字符数据类型
short       //短整型
int         //整型
long        //长整型
long long   //更长的整型
float       //单精度浮点数
double      //双精度浮点数
每种类型所占空间的大小:


sizeof是C语言中的关键字,也可以认为是一种运算符,用来获取数据在内存中所占的空间大小单位为byte(比特)。
扩展知识:
1byte = 8bit(比特位)        1kb = 1024byte        1mb = 1024kb                1gb = 1024mb                1tb = 1024gb
1.3变量、常量
变量:可以被改变的值。
常量:无法被改变的值。
1.3.1定义变量


1.3.2变量的分类

  • 全局变量
  • 局部变量


小结:当全局变量与局部变量的变量名起冲突的时候,局部变量优先!
1.3.3变量的使用


1.3.4变量的作用域与生命周期
作用域
作用域:指在程序中可用的代码范围
全局变量:整个工程 局部变量:该变量所在局部范围内
生命周期
生命周期:从创建变量到销毁变量的期间
全局变量:整个程序的生命周期 局部变量:从进入该作用域生存周期开始,出该作用域生存周期结束
1.3.5常量
常量分以下几种:

  • 字面变量
  • const修饰常量
  • #define符号常量
  • 枚举常量
#include <stdio.h>
//举例说明

enum age {
        ten,
        six,
        eight
};
//{}内的ten、six,eight皆为枚举常量

int main()
{
        //字面变量
        3.1415926; //字面常量
        88545.4; //字面常量
//- - - - - - - - - - - - - - - //
        //const修饰常变量
        const int x = 1;
        x = 2;
        //const修饰的变量是不能被直接修改值的
//- - - - - - - - - - - - - - -//
        //define常量
        #define salary 3000
        printf("%d\n", salary);
//- - - - - - - - - - - - - - -//
        //枚举常量
        printf("%d\n", ten); //0
        printf("%d\n", six); //1
        printf("%d\n", eight); //2
        //枚举常量默认从0开始,后面依次往后增一
        return 0;
}

1.4字符串
字符串:一对双引号括起来的一串字符。
注意:字符串是以\0转义字符为结束标志,在计算字符串的长度时\0是结束标志,不予算作。
#include <stdio.h>
#include <string.h>

int main()
{
        "Hello World!";
        char arr[] = "hello";
        printf("%s\n", arr);
        printf("%d\n", strlen(arr)); //strlen计算字符串长度 该长度为5
        printf("%d\n", sizeof(arr)); //sizeof计算内存中的长度 是有算上\0的 该长度为6
        return 0;
}1.4字符串
字符串:一对双引号括起来的一串字符。
注意:字符串是以\0转义字符为结束标志,在计算字符串的长度时\0是结束标志,不予算作。
#include <stdio.h>
#include <string.h>

int main()
{
        "Hello World!";
        char arr[] = "hello";
        printf("%s\n", arr);
        printf("%d\n", strlen(arr)); //strlen计算字符串长度 该长度为5
        printf("%d\n", sizeof(arr)); //sizeof计算内存中的长度 是有算上\0的 该长度为6
        return 0;
}
1.5转义字符
转义字符含义
\n换行
\t水平制表(TAB)
\b退格(BS)
\0空字符
\\反斜杠字符
\'单引号字符
\"双引号字符
\r回车
\v垂直制表
\dddddd表示1-3位八进制数字
\xdddd表示1-2位十六进制数字
#include <stdio.h>

int main()
{
        //打印一个单引号’
        printf("'\n");
        //打印一个双引号"
        printf("\"\n"); //需要加一个反斜杠\
        return 0;
}1.6注释
在程序中,/*和*/标出注释的开始和结束,/*和*/不能嵌套使用。写注释的好处是能让他人或个人更容易理解程序。
C99增加了新一种的注释,用//符号来创建注释,仅限于单行,普遍用于C++与Java。
#include <stdio.h>

int sum(int x, int y);

int main()
{
        //int a, b;
        int w = sum(10, 20);
        printf("%d", w);
        return 0;
}

/*
int sum(int x, int y)
{
        int z = 0;
        z = x * y;
        return z;
}
*/1.7选择语句
#include <stdio.h>

int main()
{
        int a;
        printf("请输入数字:\n");
        scanf("%d", &a);
        if (a == 1)
        {
                printf("yes");
        }
        else
        {
                printf("false");
        }
        return 0;

}if(条件判断表达式),如果条件判断表达式的值为真,则执行该语句;如果为假,则不执行语句。
真:非0         假:0
1.8循环语句
在生活中有时候需要循环去做某件事,使用循环语句效率高。
怎么用C语言去实现循环?

  • while语句
  • do while语句
  • for语句
  • switch语句
#include <stdio.h>

//while语句
int main()
{
        int x = 0;
        while (x <= 100)
        {
                printf("Hello\n");
                x++;
        }
        return 0;

}
#include <stdio.h>

//do while语句
int main()
{
        int x = 1;
        do
        {
                printf("Hello\n");
                x++;
        } while (x <= 0);
        return 0;

}

#include <stdio.h>

//for语句
int main()
{
        for (int i = 0; i <= 10; i++)
        {
                printf("Hello\n");
        }
        return 0;

#include <stdio.h>

//switch语句
int main()
{
        int x = 0;
        scanf("%d", &x);
        switch (x)
        {
        case 1:
                printf("上班!\n");
                break;
        case 2:
                printf("上班!\n");
                break;
        case 3:
                printf("上班!\n");
                break;
        case 4:
                printf("上班!\n");
                break;
        case 5:
                printf("上班!\n");
                break;
        case 6:
                printf("休息!\n");
                break;
        case 7:
                printf("休息!\n");
                break;
        }
        return 0;
}1.9函数
函数是构成C程序的基本单元,它可以减轻main函数的负担,使程序结构简化清晰,
可进行代码复用。
函数如果是写在main函数的后面的话是需要在main函数前面进行声明,
则写在main函数后可以不声明。
#include <stdio.h>

int sum(int x, int y);  //声明

int main()
{
        int a, b;
        int w = sum(10, 20);
        printf("%d", w);
        return 0;
}


int sum(int x, int y)
{
        int z = 0;
        z = x * y;
        return z;
}1.9数组
定义:按序排列的同类数据元素的集合为数组。
1.9.1数组的定义
int score[5] = { 10,52,60,99,45 }; //定义一个整型数组,元素最多5个  
1.9.2数组的下标
数组每个元素都拥有下标,从0开始,后面依次增一。
C语言中通过下标来引用数组,不能一次引用整个数组。
数组名[下标]
int score[5] = { 10,52,60,99,45 }; 下标范围0-4
int score1052609945
下标[0][1][2][3][4]
1.9.3使用数组
#include <stdio.h>

int main()
{
        int score[5] = { 10,52,60,99,45 }; //定义一个整型数组,元素最多5个
        for (int i = 0; i < 5; i++)
        {
                printf("%d\t", score);
        }
        return 0;
}1.10运算符
算术运算符
+ - * / %(取余)
赋值运算符
= += -= *= /= &= ^= |= >>=  <<=
位运算符
& ^ | ~        从左到右依次为与、异或、或,取反
移位运算符
<< >>        从左到右依次为:向左移与向右移
单目运算符
!           逻辑反
-           负值
+           正值
&           取地址
sizeof      数据所占的长度
~           于一个数的二进制按位取反(负数取补码,正数原码,反码,补码相同)
--          前置、后置-- 如:--a、a--
++          前置、后置++  如:++a、a++
*           间接访问操作符(解引用操作符)
(类型)       强制类型转换 如:int a = (int)5.12;
关系操作符
>        大于
>=        大于等于
<         小于
<=         小于等于
!=      用于判断数值是否"不等于"
==     用于判断数值是否"相等"
逻辑运算符
&&     逻辑与        有0出0,全1出1
||          逻辑或        有1出1,全0出0
条件运算符
表达式1? 表达式2: 表达式3  
如果表达式是1成立,返回的值为表达式2,则不成立返回的值为表达式3
逗号运算符
表达式1,表达式2,表达式3,....表达式n
从左往右计算,所取的值为最后一个表达式
下标引用、函数调用和结构成员
[] () . ->
1.11常见关键字
void char int float double short long signed unsigned struct union enum typedef sizeof auto static register extern const volatile return continue break goto if else switch case default for do while
由于比较多,所以挑选一些讲。有些没讲的后续一些章节可能会提到。
1.11.1 typedef关键字
typedef:类型重定义
#include <stdio.h>

typedef unsigned int u_int;
int main()
{
        //unsigned int a = 1; 初始
        u_int a = 1; //重定义后
        return 0;
}1.11.2 static关键字
static:用来修饰变量和函数
1.修饰函数时为静态函数
2.修饰局部变量时为静态局部变量
3.修饰全局变量时为静态全部变量
<1>修饰函数
//1.c代码
#include <stdio.h>
extern int Max(int x, int y);
int main()
{       
        int s = Max(2, 5);
        printf("%d", s);
        return 0;
}

//2.c代码
#include <stdio.h>
static int Max(int x , int y)
{
        if (x > y)
                return x;
        else
                return y;
        return 0;
}
编译的时候1.c报错了。
总结:函数被static修饰后,使得函数只能在本源文件中使用,其它源文件不能使用。
<2>修饰局部变量
//1.c代码
#include <stdio.h>
extern int Add(int x, int y);
int main()
{
        int i = 0;
        for (i = 0; i < 3; i++)
        {
                int s = Add(1, 2);
                printf("%d\t", s);
        }
        return 0;
}

//2.c代码
#include <stdio.h>
int Add(int x, int y)
{
        static int z = 1;
        x += 3;
        y *= 2;
        z += 1;
        int sum = x + y + z;
        return sum;
}输出结果为10        11         12,不是10        10        10
总结:static改变了局部变量的生命周期,原先的生命周期为局部范围内,现在局部变量的范围为整个程序的开始到结束。
<3>修饰全局变量
1.c代码
#include <stdio.h>

static int num = 1; //static一个全局变量

2.c代码
#include <stdio.h>
extern int num; //声明
int main()
{       
        printf("%d", num);
        return 0;
}2.c代码在编译的时候报错了。
总结:static限制了全局变量,使得全局变量只能在本源文件中使用,不能被其他源文件所使用。
1.11.3 register关键字
int main()
{
        register int a = 1;  //建议定义的变量存储在寄存器中
        return 0;
}1.11.4 union关键字
union:联合体(共用体)
1.11.5 extern
extern:用来声明外部符号
1.c源文件
#include <stdio.h>
extern int num; //声明
int main()
{       
        printf("%d", num);
        return 0;
}2.c源文件
#include <stdio.h>
int main()
{
    int num = 1; //定义一个全局变量
    return 0;
}1.11.6 auto
auto:主要用于声明变量的生存期为自动
1.12 #define定义常量与宏


宏:替换
1.13指针
1.13.1内存
内存是计算机上的存储器,是用来存放数据和程序的。
为了有效使用内存,内存分分为许多内存单元,一个内存单元为一个字节。
为了有效访问内存单元,为每个内存单元编号,这些编号叫做地址。
内存         地址
一个字节008FFE4C
一个字节008FFE4D
一个字节008FFE4E
一个字节.....
一个字节
一个字节
变量是存在内存中的,会分配内存单元,每个内存单元都有地址,即变量也有地址。
取出并打印变量地址:
#include <stdio.h>
int main()
{
        int a = 1;
        &a; //取出a的地址
        printf("%p\n",&a); //以%p的格式打印a的地址
        return 0;
}
如何存储地址,需要定义指针变量:
#include <stdio.h>
int main()
{
        int a = 1;
        int *p = &a; //a的地址赋值给指针变量p
        return 0;
}指针的使用:
#include <stdio.h>
int main()
{
        int a = 1;
        int *p = &a; //a的地址赋值给指针变量p
        *p = 2;  //此时a的值为2
        return 0;
}此例为整型指针,其他类型是一样的。
1.13.2指针变量的大小
指针变量的大小取决于地址的大小,指针大小在32位平台是4个字节,
64位平台是8个字节。
1.14结构体
结构体:一种数据结构,用以实现较复杂的数据结构
比如在描述学生的时候,信息包括学号,名字,成绩,年龄,班级等信息
#include <stdio.h>
//定义结构体
struct Stu {
        int id;
        char name[50];
        double score;
        int age;
};

int main()
{
        struct Stu x = { 1,"李四",90.5,20 }; //结构体初始化
        printf("%d %s %lf %d\n",x.id, x.name, x.score, x.age);
        //.为结构成员访问操作符 结构体变量.成员变量
        struct Stu *p = &x;
        printf("%d %s %lf %d\n", (*p).id, (*p).name, (*p).score, (*p).age);

        printf("%d %s %lf %d\n", p->id, p->name, p->score, p->age);
        //->操作符 结构体指针->成员变量
        return 0;
}本章完结。
下一章:[C语言学习笔记--2]分支与循环语句 - 知乎 (zhihu.com)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表