【C语言学习笔记】

news2024/11/23 21:09:48

C语言发展史:

  • 1960         原型A语言->ALGOL语言

  • 1963         CPL语言
  • 1967         BCPL
  • 1970         B语言
  • 1973         C语言

C语言特点:

  1. 基础性语言
  2. 语法简洁 紧凑 方便 灵活(得益于指针)
  3. 运算符 数据结构丰富
  4. 结构化 模块化编程
  5. 移植性好 执行效率高
  6. 允许直接对硬件操作

C语言学习建议:

  1. 概念的正确性
  2. 动手能力
  3. 主动阅读优秀的程序段
  4. 大量练习,面试题,编程是技术不是理论

C课程讲解思路:

  1. 基本概念
  2. 数据类型 运算符 表达式
  3. 输入输出
  4. 流程控制
  5. 数组
  6. 指针
  7. 函数
  8. 构造类型
  9. 动态内存管理
  10. 调试工具(gdb、make)和调试技巧
  11. 常用库函数

平台介绍:

        64位的redhat6,vim(编辑器),gcc(make)

hello.c:"Hello world"

#inlcude <stdio.h>
#include <stdlib.h>

int main(void){
    printf("hello world!\n");
    exit(0);
}

编译器gcc:

C源文件->预处理->编译->汇编->链接->可执行文件

完整过程

  • 预处理
gcc -E hello.c > hello.i
  • 编译
gcc -S hello.i 
  • 汇编
gcc -c hello.s 
  • 链接->可执行文件
gcc hello.o -o hello

或者

gcc hello.c -o hello

又或者

make hello

执行

./hello

编辑器vim:

vim配置脚本以及常用快捷方式

一、基本概念

1、以helloworld为例对写程序的思路提出如下要求:

        1)头文件正确包含的重要性

                在c中,如果没有出现函数原型,就默认函数的返回值是int

#include <stdio.h>
#include <stdlib.h>//malloc存在的头文件
int main()
{
    int *num = (int *)malloc(sizeof(int));//包含头文件后就不需要强制类型装换了
    return 0;
}

        2)以函数为单位来进程程序编写

        3)声明部分+实现部分

        4)return 0;

        5)多用空格空行

        6)添加注释

1、
//

2、
/*    */

3、
/**
 *
 *
 *
 */

4、在预处理的时候不参与编译
#if 0


#endif

2、算法:解决问题的方法(流程图、NS图、有限状态机FSM)

3、程序:用某种语言实现算法

4、进程:

5、防止写越界、防止内存泄漏、谁打开谁关闭、谁申请谁释放

二、数据类型、运算符和表达式

1、数据类型(基本数据类型)

  • 基本类型
    • 数值类型
      • 整型
        • 短整型 short
        • 整型 int
        • 长整型 long
      • 浮点型
        • 单精度型 float
        • 双精度型 double
    • 字符类型 char
  • 构造类型
    • 数组
    • 结构体 struct
    • 共用体 union
    • 枚举类型 enum
  • 指针类型
  • 空类型 void

        1)所占节数

        2)存储区别

整型数的存储都是以补码形式来进行存储的
254 -> unsigned int -> 32bit
-254 -> 取绝对值 254  -> 1111 1110 取反 + 1

(254)10 = (1111 1110)2 = (376)8 = (FE)16

254
B11111110(c不认识这个表示)
0376
0xFE

浮点类型存储方式
0.314*10^1
0~32:
    0~22(23位):记录精度部分
    23~30(8位):存储指数部分
    31(1位):符号位

字符类型
存储的是二进制形式(ASCII码表)0~127 前128个都是标准C规定的ASCII码值情况 128~255 是补充进来的
字符   十进制 十六进制
0      048     30
A      065     41
a      097     61

        3)不同类型的数据间进行转换(隐式、显式->强制类型转换)

        隐式

int i;
float f;
doubel d;
char ch;

ch + i -> i
f -d -> d

(ch + i) - (dloat -double) -> double

        4)特殊性:

                (1)布尔型bool

                        逻辑真、逻辑假

#incldue <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int main() {
  bool a = false;
  printf("a = %d\n", a);
  exit(0);
}

                (2)float类型

                        浮点型的失真问题

int func(float f) {
  if (f < 0) {
    return -1;
  } else if (fabs(f-0) <= 1e-6) {
    return 0;
  } else {
  return 1;
  }
}

                (3)char型是否有符号

                        c中 char有无符号是未定义行为

                (4)不同形式的0值:0、‘0’、“0”、‘\0’

0(整形) '0'(字符常量) "0"(字符串常量) '\0'(字符常量)

                (5)数据类型与后续代码中所使用的输入输出要相匹配(防止自相矛盾)

#include <stdlib.h>
#include <stdio.h>

int main() {
  unsigned int a;//无符号
  a = 1 << 31;
  printf("%ud", a);//无符号
}

2、常量与变量

1)常量:在程序执行过程中值不会发生变化的量

分类:整型常量、实型常量、字符常量、字符串常量、标识常量

  • 整形常量: 1 、52、752
  • 实型常量: 2.2 、3.14、1.9999
  • 字符常量(由单引号引起来的单个的字符转义字符): 'a'、'X'、'\t' 、'\n'、 '\0' 、'\015'(8进制)、 '\x7f' (16进制)、'\018'(错误的表示,八进制不会出现8!!)
  • 字符串常量(由双引号引起来的一个或多个字符组成的序列): ""(空串:尾0)、 "a" 、"abXYZ"、 "abc\n\021\018"(a b c \n \021 \0 1 8)
  • 标识常量:#define 宏名 宏体,处理在程序的预处理阶段,占编译时间,优点:一改全改,缺点:不检查语法,只是单纯的宏体与宏名之间的替换
#include <stdlib.h>
#include <stdio.h>

#define PI 3.1415926
#define ADD 2+3
// 正确写法
//#define ADD (2+3)
int main() {
  printf("%f\n", PI);
  printf("%d\n", ADD * ADD);
}
#include <stdlib.h>
#include <stdio.h>

#define MAX(a,b) ({typeof(a) A=a,B=b; ((A) > (B) ? (A) : (B));})

int main() {
  int a = 3, b = 5;
  printf("%d\n",MAX(a++, b++));
  printf("%d\n",MAX(a++, b++));
}

         在程序的预处理阶段,占编译时间,不占运行时间(没有函数调用的消耗),但不检查语法(比较危险)

2)变量:用来保存一些特定内容,并且在程序执行过程中值随时会发生变化的量

 定义:[存储类型] 数据类型 标识符 = 值

                                   TYPE NAME = VALUE;

        标识符:由字母,数字,下划线组成且不能以数字开头的一个标识序列。写标识符尽量做到                           见名生义。

        数据类型:基本的数据类型+构造类型

        :注意匹配

        存储类型autostaticregisterextern(说明型)

                         auto: 默认,自动分配空间,自动回收空间

                         register :(建议型)寄存器类型,只能定义局部变量,不能定义全局变量,大小                                                     有限制,只能定义32位大小的数据类型,比如double就不可以。因为寄                                            存器没有地址,所以一个register类型的变量无法打印出地址查看或使用

                         static:静态型,自动初始化0值或空值,并且static变量的值有继承性。另外常                                         用来修饰一个变量或者函数(防止当前函数对外扩展)

#include <stdlib.h>
#include <stdio.h>

void func() {
  static int x = 1;
  x++;
  printf("%d\n", x);
}

int main() {
  func();
  func();
  func();
}

2
3
4

                         extern: 说明型,意味着不能改变被说明的量的值或类型 可以用来扩展外部变量                                          的作用域

                                        main.c 

#include <stdio.h>
#include <stdlib.h>

#include "proj.h"

int i = 10;

int main()
{
    printf("[%s]:i = %d\n",__FUNCTION__,i);
    func();
    exit(0);
}

                                        proj.c 

#include <stdio.h>
#include <stdlib.h>

#include "proj.h"


void func(void)
{

    printf("[%s]:i = %d\n",__FUNCTION__,i);

    exit(0);

}

                                         proj.h

#ifndef PROJ_H__
#define PROJ_H__

extern int i;
void func(void);

#endif

变量的生命周期和作用范围

        (1)全局变量和局部变量

        (2)局部变量和局部变量

        (3)参考图片

3、运算符和表达式

表达式与语句的区别

表达式 i = 1   i= j*2
语句   i = 1; i= j*2;

运算符部分:

        1)每个运算符所需要的参与运算的操作数个数

        2)结合性

        3)优先级

        4)运算符的特殊用法

                如:%:必须是整数

                        =(赋值)与==(比较)

                        逻辑运算符的短路特性(&& :前面为假,||:前面为真,后面都不需要计算了)

#include <stdio.h>
#include <stdlib.h>

int main() {
  int a = 1, b = 2, c = 3, d = 4;
  int m = 1, n = 1;
  
  (m = a > b) && (n = c > d);
  
  printf("m = %d\n n = %d\n", m, n); // m : 0 n : 1
}

        5)位运算的重要意义

  • | 按位或
  • & 按位与
  • ^ 按位异或:相同为0,不同为1
  • ~ 按位取反

        应用

                将操作数中的第n位置1 其他位不变 num = num | 1 << n;

                将操作数中的第n位置0 其他位不变 num = num & ~(1<<n);

                测试第n位: if(num & (1<<n))

求字节数:sizeof

#include <stdio.h>
#include <stdlib.h>

int main() {
  printf("%lu, %lu, %lu, %lu, %lu, %lu, %lu\n",
         sizeof(int),sizeof(short), sizeof(long),
         sizeof(double), sizeof(float), sizeof(char), sizeof(void*));
}

4, 2, 8, 8, 4, 1, 8

自增、自减

运算符在前,先进行计算,再取变量值使用

变量在前,先取变量值使用,再进行计算

int i = 1, j = 2, value;
value = i++ + ++j

三、输入、输出

input &output ->I/O(标准IO,文件IO)

1、格式化输入输出函数:scanf,printf

int printf(const char *format, ...);
format:"%[修饰符] 格式字符"

 

2、字符输入输出函数:getchar,putchar

3、字符串输入输出函数:gets(!),puts

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2229989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧城市的守护者——智能井盖监测终端

城市化进程的加速推进使得基础设施建设成为提升城市品质的关键环节。然而&#xff0c;在这一进程中&#xff0c;市政公用设施中的井盖与地下线缆的安全问题却日益凸显。由于缺乏有效的实时监控与管理体系&#xff0c;给犯罪分子留下了可趁之机&#xff0c;频繁发生的井盖被盗及…

C语言 | Leetcode C语言题解之第513题找树左下角的值

题目&#xff1a; 题解&#xff1a; #define MAX_NODE_SIZE 10000int findBottomLeftValue(struct TreeNode* root){int ret;struct TreeNode** queue (struct TreeNode **)malloc(sizeof(struct TreeNode) * MAX_NODE_SIZE);int head 0;int tail 0;queue[tail] root;whil…

HarmonyOS应用开发者基础认证——初级闯关习题参考答案大全

相关文章 HarmonyOS应用开发者中级认证——中级闯关习题参考答案大全 HarmonyOS应用开发者高级认证——高级闯关习题参考答案大全 文章目录 HarmonyOS第一课 HarmonyOS介绍判断题单选题多选题 HarmonyOS第一课 DevEco Studio的使用判断题单选题多选题 HarmonyOS第一课 ArkTS语法…

SpringBoot 集成 Mybatis-Plus,LambdaQueryWrapper 使用方法

&#x1f3dd;️ 博主介绍 大家好&#xff0c;我是 一个搬砖的农民工&#xff0c;很高兴认识大家 &#x1f60a; ~ &#x1f468;‍&#x1f393; 个人介绍&#xff1a;本人是一名后端Java开发工程师&#xff0c;坐标北京 ~ &#x1f389; 感谢关注 &#x1f4d6; 一起学习 &am…

Word文档丢失抢救方法:15 个 Word 文档恢复工具

MS Word 文档恢复的重要性 对于严重依赖 Microsoft Word 创建和编辑文档的个人和企业来说&#xff0c;MS Word 文档恢复是一个至关重要的方面。 文件损坏、系统崩溃和其他意外事件可能会导致 Word 文档中存储的重要数据丢失。 及时恢复这些文档有助于节省时间、精力和资源。 本…

python实战项目51:selenium结合requests获取某众点评评论

python实战项目51:selenium结合requests获取某众点评评论 一、selenium获取cookies二、利用requests发送请求三、注意事项四、完整代码一、selenium获取cookies 首先,初始化selenium的webdriver,然后使用webdriver打开某众点评主页,之后手动扫码登录,利用selenium的get_c…

ETLCloud怎么样?深度解析其在数据管理中的表现

在BI或数据大屏等数据分析工具中&#xff0c;经常需要从多个业务系统中提取原始数据&#xff0c;然后对数据进行清洗、处理&#xff0c;以获取高质量、有效且干净的数据以供后续的BI进行数据统计和分析使用&#xff0c;从高质量的实现企业数据的价值变现。 然而&#xff0c;在…

《花少6》豆瓣评分3.9,“锅”不该周雨彤一个人背

《花儿与少年 第六季》以豆瓣评分3.9成为了整个系列IP有史以来口碑最差的一季节目。 播出过半的《花少6》终于在万众期待下开分了&#xff0c;豆瓣首次开分为4.8&#xff0c;实际上已经是“花少”史上最低评分&#xff0c;紧接着短短几天持续下滑至3.9分&#xff0c;让原本就不…

WPF+MVVM案例实战(十七)- 自定义字体图标按钮的封装与实现(上)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、案例效果1、按钮分类2、BC类按钮实现1、文件创建2、字体图标资源3、自定义依赖属性4、按钮特效样式实现3、案例实现1、案例效果 1、按钮分类 在WPF开发中,最常见的就是按钮的使用,这里我们总…

day-77 超级饮料的最大强化能量

思路 动态规划&#xff1a;因为每一步要么选A&#xff0c;要么选B&#xff0c;所以问题可以转换为求最后一步从A选或从B选中的较大值 解题过程 定义而二维数组dp,dp[i][0]表示最后一步从A取能获得的最大能量&#xff0c;dp[i][1]表示最后一步从B取能获得的最大能量状态转换方程…

91.【C语言】数据结构之单向链表的头删和尾删

目录 1.尾删函数SLTPopBack 代码示例(写入SList.c) 在SList.h中写入该函数的声明 main.c部分代码改为 ​编辑 分析 解决方法 方法1:双指针算法(快指针tail,慢指针pretail) 方法2 2.头删函数SLTPopFront 一个节点示意图 多个节点示意图 代码示例(写入SList.c) 在S…

C语言内幕--全局变量(结合内存分区、汇编视角看类型、连接器)

前言 学习资源&#xff1a;b站up主&#xff1a;底层技术栈学过C语言都知道&#xff0c;全局变量可以再全局中使用&#xff0c;其实全局变量内部还是涉及到不少知识&#xff0c;这里从内存分区、汇编视角看类型、连接器等角度看待全局变量&#xff1b;由于涉及到底层技术&#…

新160个crackme - 089-fornixcrackme1

运行分析 需要破解Name和Serial PE分析 ASM程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida搜索找到关键字符串 动态分析关键函数&#xff0c;逻辑如上图&#xff0c;通过Name计算得到char_1&#xff0c;亦或后对比Serial&#xff0c;相等则返回成功信息 分析…

Python爬虫系列(一)

目录 一、urllib 1.1 初体验 1.2 使用urllib下载网页、图片、视频等 1.3 反爬介绍 1.4 请求对象定制 1.5 get请求的quote方法 1.6 多个参数转成ascii编码 1.7 post请求 1.8 综合案例演示 一、urllib 1.1 初体验 # urllib是python默认带的&#xff0c;无需额外下载 i…

动态规划-回文串问题——5.最长回文子串

1.题目解析 题目来源&#xff1a;5.最长回文子串——力扣 测试用例 2.算法原理 1.状态表示 判断回文子串需要知道该回文子串的首尾下标&#xff0c;所以需要一个二维数组且数据类型为bool类型来存储每个子字符串是否为回文子串&#xff0c; 即dp[i][j]:以第i个位置为起始&a…

源代码安全管理:深信达SDC沙盒技术解密

在数字化时代&#xff0c;源代码安全管理的重要性日益凸显&#xff0c;它不仅关系到企业的核心竞争力&#xff0c;更是企业智慧成果的结晶。深信达的SDC沙盒防泄密软件以其独特的技术优势&#xff0c;为源代码安全提供了全方位的保护。 源代码安全管理的重要性 源代码作为企业…

Virtuoso使用layout绘制版图、使用Calibre验证DRC、LVS、PEX抽取RC

1 绘制版图 1.1 进入Layout XL 绘制好Schmatic后&#xff0c;在原理图界面点击Launch&#xff0c;点击Layout XL进入版图绘制界面。 1.2 导入元件 1、在Layout XL界面左下角找到Generate All from Source。 2、在Generate Layout界面&#xff0c;选中“Instance”&#…

YOLO11改进 | Neck | 有效提升小目标检测效果,附完整代码结构图【论文必备】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 本文给大家带来的教程是将YOLO11的卷积替…

vue文件转AST,并恢复成vue文件(适用于antdv版本升级)

vue文件转AST&#xff0c;并恢复成vue文件---antdvV3升级V4 vue文件转AST&#xff0c;重新转回原文件过程如何获取项目路径读取项目文件&#xff0c;判断文件类型分别获取vue文件 template js&#xff08;vue2和vue3&#xff09;处理vue 文件template部分处理vue script部分uti…