C语言学习笔记,分享给各位交流一下。

C语言

二进制(机器语言)-助记符(汇编语言)-C语言(高级语言)
国际标准-89年-C89/C90

印象笔记/有道云笔记+xmind思维导图
语言C/C++/Java + 数据结构DS + 系统和网络(Linux+系统编程+网络基础+网络编程)

运行环境-DevC++5.11软件介绍

  1. 新建cpp文件,兼容c文件。
  2. 编译检查语法,运行即运行,调试(debug,不能是release)是模拟发布环境,可以插入断点查看代码运行

头文件

  1. stdio.h 标准输入输出文件,包含各种基础语法

  2. stdlib.h 标准库文件,存放各种库,内部有让程序运行后能够窗口不消散system(“pause”):暂停
    system(“pause”);
    动态内存分配函数malloc();void* malloc(unsigned size)
    功能:申请在内存的堆区中连续分配一块size字节的空间。若申请成功,则返回指向所分配内存空间的起始地址的指针。若失败,则返回NULL。该函数具体使用时,需要强制转换为特定类型的指针。
    例子:int* p=(int*)malloc(5sizeof(int));该语句定义了一个int类型的指针,指向一块存放int变量的空间,该空间大小是5个int大小,即20字节。
    动态内存分配函数calloc();void
    calloc(unsigned n,unsigned size);——用的少
    功能:和malloc差不多,唯一区别是 分配空间的数据会全部初始化为0。
    动态释放函数free():void free(void* ptr)
    功能:释放ptr指向的动态分配空间。若ptr为NULL,则什么都不做
    备注:为保证堆区(动态存储区)的有效利用,在知道某个动态分配块不再用时,应及时将它释放

  3. math.h 数学符号库,sqrt开方;pow平方;fabs浮点数绝对值;abs整数绝对值

DLL文件-动态链接库

Dynamic Link Library
可以理解为可执行文件exe的变种,多数情况下,两个文本内容类似,都是一堆机器指令。
DLL的运行依赖于别的exe文件中的线程,起辅助功能,因为它的内部包含“通用的”代码或数据;例如comdlg32.dll就是通用对话框组件库
操作系统运行exe文件流程

  • 操作系统读取exe到内存
  • exe的代码说它需要dll的辅助
  • 操作系统检索dll(检索要求,dll必须在下列目录:exe所在目录、Windows系统目录、Windows目录、当前目录、PATH指定的目录)
  • 操作系统读取dll到内存
  • 正常运行

经典算法

  1. 选择排序
    第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。
  2. 冒泡排序
    重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

常用字符串函数

函数接口功能说明备注
gets(char* s)获取字符串s  和scanf不同,gets接收空格,以回车结束,自动在输入字符串末尾加结束符。gets也和getchar()一样会读缓存中的内容,所以若gets前有输入,则一般会在gets前加gethcar()以提前吸收回车符.
puts(char* s)输出字符串s输出后自动换行(换行符和回车符在ASC中编号不同,但是打出来一样
strlen(char* s)获取s的长度
strcmp(char* s1,char* s2)按字典序比较s1和s2的大小,若s1>s2,返回整数,等于返回0,小于返回负数若s1和s2是重复字符,例如aaa,则比较长度
strcpy(char* s1,char*s2)将s2的全部内容复制到s1无论s1多长都会变为s2

时间复杂度和空间复杂度

单层循环
二重循环

语法语句

  1. 符号
    \t:输出4个空格
    \n:换行
    &&:与
    ||:或
    !:非
    \0:自动添加的结束符

  2. 基本概念
    内存4区:堆区、栈区、全局区、代码区
    main{int a=1};是局部变量,存放在栈区,出了{}后,就被内存空间释放了
    后面会讲到动态内存分配,将变量都存放在堆区,在程序结束(或手动释放)后才会消亡
    如果把局部变量变成全局变量(放到{}以外)就会放到全局区,在程序结束后会消亡
    代码区存放代码
    C程序的生成:编译、链接(编译后生成.o文件-二进制文件,加上库文件,互相链接程序=exe)
    C语言自定义函数:如果定义函数在主函数的后面,那么要在开头声明,类似与h文件
    自顶向下、模块化设计、结构化设计

  3. 数据类型
    int 整数 4个字节
    float 单精度浮点数 4个字节
    double 双精度浮点数 8个字节
    char 字符 1个字节 有8位,可以表示的字符数有255个,都是ASC码表上的
    字符可以用getchar()输入(一个一个的接收),putchar()输出
    常量:变量类型前加上const
    强制转换:有一个精度的概念,低字节转高字节一般不会错

  4. 输入输出
    输出:printf
    输入:scanf,输入要带上&符号,遇到空格结束一次(字符串可以不用&)

C语言没有字符串类型,一般通过char[]字符数组实现。

整数输入输出格式:%d
小数输入格式:float %f;double %lf
小数输出格式:统一:%f,如果要保留2位小数:%.2f
字符型:%c
指数形式输出:%e
字符串输出:%s

  1. 三目运算符
    C语言中?:的用法类似于if和else,它是一个条件运算符,格式是表达式1?表达式2:表达式3,含义是:如果表达式1成立(值为真),则表达式2是整个条件表达式的值;如果表达式1不成立(值为假),则表达式3是整个条件表达式的值。

  2. 状态机思想
    对于需要判断的语句有效果

  3. 区别整数的排序比较大小,字符串是使用string.h中封装的一些函数来的

	for(i=0;i<4;i++)
	for(j=0;j<4-i;j++)
	if(strcmp(s[j],s[j+1])>0){
		strcpy(temp,s[j]);
		strcpy(s[j],s[j+1]);
		strcpy(s[j+1],temp);
	}

数组和指针

  1. 数组里面用输入的元素作为元素的索引的思想
    a[option]++;

  2. 数组中存储输入的方法
    一维数组:同二维
    二维数组:

int i,j,a[3][2];//3*2二维数组
for(i=0;i<3;i++)//一行代码可以省略{}
for(j=0;j<2;j++)
    scanf("%d",&a[i][j]);

字符数组:

char line[80];
	line[79]='\0';//字符串要填结束符 
	while((line[k]=getchar())!='\n')// 
		k++;    

数组是核心,在项目开发中

  1. 指针(指针变量)
    保存数据地址的变量,称作指针变量。严格来讲指针就是数据地址。
    指针的定义形式是:数据类型 *变量名:int *p
    指针与其他变量的本质区别是:指针存放的是地址,其他变量存放的是数据值。所以修改p,其实是修改p存放的变量地址(修改p的指向)
    取内容:p=*a
    取地址:p=&a
    符号的详细理解
    关于&符号:
    1. 两个之间——按位与
    2. 一个之前——取地址
      关于*符号:
    3. 两个之间——表示相乘
    4. 出现在变量类型后面­——表示定义一个指向该变量型数据的指针
    5. 出现在一个变量前面(且*前面没有变量类型)——取内容(取出指针指向的数据单元)

指针也是变量,所以可以用常量符号修饰

  • const int* p;
    表示常量指针,p的值固定了,也就是p的指向固定了,但是指向的内容可以改变
  • int* const p;
    表示指针常量,p指向的内容固定了,但是p本身,即p的指向可以改变

分析下列代码,那个能够实现a与b的交换

    void swap1(int x,int y){
        int t;
        t=x;
        x=y;
        y=t;
    }
    void swap2(int* x,int*y){
        int t;
        t=*x;
        *x=*y;
        *y=t;
    }
    void swap3(int* x,int* y){
        int *t;
        t=x;
        x=y;
        y=t;
    }

只有swap2能够实现a与b的交换

  1. 传递的是形参
  2. 传的是指针,所以t保存的是x所指向的变量,即实参
  3. 传的也是指针,但是t保存的是指针x,而不是指针所指向的变量

对指针的浅显应用理解:在函数中使用指针,可以不用返回值,通过指向的方法本质是在函数中改变实参了。

  1. 数组等价于指针
    在函数传递中:int* a等价于int a[],单独的a就是数组的首地址

递归与宏定义

  1. 递归
    递归的本质就是:在函数内部调用函数,同时准备一个判断条件
    递归不断调用函数,可能会出现栈溢出的现象,因为没有完成的函数都存在内存的栈区
    递归是最底层的先处理

  2. 宏定义
    单纯的文本替换
    可以定义函数

#define max(a,b) a>b?a:b

与全局变量不同

结构体

结构体是自定义得数据类型,所以它也有一般数据类型的性质,比如定义数组、定义指针等等,在结构体中,可存放多个不同类型的数据,这是与一般数据类型的最大区别

struct stu{
    char x;
    int y;
    float z;
} a;
//这样就定义了一个名为a,数据类型为stu的变量,a.x=
//以上是C语言,如果是C++语法,直接不用a,用stu即可定义变量,要先实例化,直接stu s;s.x=

为了简化上述式子,可以使用typedef关键字定义结构体,简化书写
可存放多个不同类型的数据,这是与一般数据类型的最大区别

struct stu{
    char x;
    int y;
    float z;
} a;
//这样就定义了一个名为a,数据类型为stu的变量,a.x=
//以上是C语言,如果是C++语法,直接不用a,用stu即可定义变量,要先实例化,直接stu s;s.x=

为了简化上述式子,可以使用typedef关键字定义结构体,简化书写

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值