C高级笔记总结

2023-11-09

GCC :

1、gcc 组件

	(1)分析器:分析语法结构,将C语言编译汇编语言。.s
	(2)汇编器:将汇编代码编译成二进制文件
	(3)链接器:链接目标文件以及库文件,生成可执行代码。
	(4)标准C库:提供核心的C库函数。scanf  printf 

2、gcc编译过程:

	(1)预处理:   宏替换和头文件展开.c - > .i 。
		gcc -E test.c  -o test.i
	(2)编译:     将经过预处理后的文件.i,编译成汇编文件.s
		gcc -S test.i  -o test.s
	(3)汇编:     将汇编文件.s 编译成目标文件.o 二进制码
		gcc -c test.s  -o test.o
	(4)链接:     将一个或多个目标文件,及库链接成为可执行二进制文件
		gcc   test.o  -o a.out
		
	gcc  -g test.c    生成可执行文件,同时附加调试信息,以便于GDB工具使用
	
	gcc -O    编译时需要使用编译优化。
		-O1  O2 
		
	gcc -I头文件路径      指定头文件的搜索路径

	gcc -l第三方库名      指定链接的其他库 


第一类∶标点符号,符号错误

第二类∶头文件错误

第三类∶档案库错误

第四类∶未定义符号

GDB :调试工具

1、调试的程序,编译时必须加 -g 选项
	gcc -g  C文件  
2、gdb  程序名
	gdb ./a.out
	
GDB调试模式:
1、退出   q

2、l 查看源码
3、b 行号      设置断点
4、info b      查看设置 的断点
5、del  断点号     删除断点
6、r           全速运行
7、n       	   单步执行 
8、p  变量名   查看变量的值
9、c  恢复运行    全速运行到下一断点或程序结束

栈回溯命令  backtrace

用于定位段错误位置。

打印法调试。

变量:

对存储空间的抽象,内存空间命名        

数据类型:int char double float 
	本质:空间的大小,空间使用的方式

存储方式:
	全局变量 : 整个文件,及文件外都可以使用: 				作用域
				从程序开始到结束,变量空间一直有效:		生命周期
				存放位置									静态区
				
	局部变量 :  当前代码块 {}        						作用域
				代码块开始到该块结束						生命周期
				存放位置 									栈区		
					
	静态变量  :
		static 修饰的局部变量:  静态局部变量
			当前代码块 {}        						作用域
			从程序开始到结束,变量空间一直有效:		生命周期
			存放位置									静态区
	
	在静态区的变量。只能被初始化一次。

		static  修饰全局变量  : 静态全局变量
			整个文件,限制在文件外的使用: 				作用域
			从程序开始到结束,变量空间一直有效:		生命周期
			存放位置									静态区
	
		static 函数:   静态函数:限制函数的作用域
	
	常量 
		const 修饰的变量

	寄存器变量
		register 修饰的变量 

指针:

什么是指针变量: 一个4字节空间,存放的是内存地址。   32位 - 4字节   64位 - 8字节

指针变量的定义:
int *p;
指针指向的数据类型   * 指针变量名;

指针的赋值:指针的类型   必须类型一致才可以赋值   p=&a;
	将某个空间的地址写入到指针变量的空间
	物理意义:给指针变量建立指向关系。

野指针,空悬指针:没有建立指向关系的指针;
空指针:一个指向0地址的指针,该指针不能进行除赋值以及关系运算以外的任何操作。


指针的使用:   前提:1、指针必须建立指向关系;

	1、取指针指向的内容;
		(* 指针变量名); 代指指向的内容
	int a[10]; int * p = a;   p -> a[0]    
	
	p-> a;  p 数组指针  int (*p)[];    a[][];     p = a;    p -> a[0]
	        int **p  a[][];    p - > a[0];    (*p) ++;
			
			int **p  int *a[];   p -> a[0]  
	
	
	2、指针运算 ,必须满足物理意义。
		(1)算数运算:  +1  -1  ++  --  +n 
				本质:地址的移动;  
				对p移动的字节单位 =   n * 数据类型(*p)字节单位
									
				指针进行算数运算后,仍然是一个指针;
				int *p;
				p=p+1;   p+1;  p++;
				
				*p++; *(p+1); *p +1;
				
				
		一级指针和一维数组:
		int  a[10];
		int *p =a ;
			a:数组名 1、代指这个数组。 2、代指数组首地址
			数组名 不能赋值
			p++;  (*P)
		
							int **p;  int *p[3];  int (*p)[3];
							
sizeof();  计算类型的字节大小    sizeof(p) 8  sizeof(*p)  24
参数:1、数据类型
	  2、变量名,指,计算该变量的类型的大小。

指针与指针的算数运算:  1、只能进行减法操作 2、必须大-小  3、两指针的类型必须一致

	计算的结果 = 两指针间相距的类型个数。

指针的关系运算:  <   >  ==  <=  >=   != 
	本质:指针的位置关系。两指针的类型必须一致

字符数组和字符串;

const  修饰指针:
1、 const int *p;
	const 修饰* ,表示  *p 只读,不能写。 p 指针变量本身,不受此限制。
2、 int * const p;
	const 修饰p, 表示  p  只读,不能赋值。  *p 不受此限制。
3、 const int * const p;
	都不能修改,全部只读;

void 修饰指针;

void *p;  万能指针
	表示,先定义这样一个指针容器,指向的内容的类型不明确。
		一个地址,地址指向的内容类型不明确。


1、指针实现  strcpy();  字符串拷贝
	char *strcpy(char *dest, const char *src);

2、指针实现  字符串拼接
	char *strcat(char *dest, const char *src);

3、字符串倒序
	char *str(char *a); 

指针数组:和二级指针
本质:一个数组,里面的元素是指针。

定义:指针数据类型* pa[10];
	int  *p[10];

二级指针变量:
	本质:地址空间,存放地址,该地址指向一个指针变量。

定义:数据类型 **指针变量名;


数组指针的数组名  与二级指针可以直接赋值,其类型与表示的物理意义完全一致。
例:
	int  *a[3];
	int **p = a;
	
	
	其中对 a ,不能进行赋值操作,因为a是一个数组。
	对 p 可以进行所有的指针操作
	(*p)  是数组a中的一个元素,该元素是一个指针类型,
		因此,可以对(*p) 进行指针的所有操作
		但,注意,在(*p)进行赋值操作后,指向的新位置,
		要确认是否有权限进行*操作。

异或方式交换两个数;

a  = 1111 0101   = 0x f5        1111 0000
b  = 0011 1100	 = 0x 3c        1111 0000     a b

a = a ^ b                        

a = 1100 1001					0000 0000    = '\0'
b = 0011 1100				    0000 0000
b = a ^ b 

b = 1111 0101					0000 0000
a = 1100 1001					0000 0000

a = a ^ b 

a = 0011 1100
b = 1111 0101

数组指针:与二维数组

数组指针:
	本质是一个指针,指针指向一个数组

定义:   数组指针
int	(*p)[n];   

元素类型   (* 指针名 )[数组的元素个数];

二维数组:
	数组名 1、代指这个数组。 2、代指数组首地址

二维数组的数组名 可以使用一个数组指针来存放;
例:
	int a[3][4];
	int (*p)[4] = a;
p++;  1 * a[0] 4*4
		a[1]

对p 可以使用指针的所有操作,也可以当二维数组来使用
(*p)  代指指向的数组,所以,不能进行赋值操作  

总结: 指针变量,
	指针和数组 (1) 指针数组   (2)数组指针

函数:

(1)、函数的定义
返回值类型   函数名(形参列表) { 函数体 }
指针函数:  返回值是指针类型的函数;

(2)、函数的声明
返回值类型   函数名(形参列表);

(3)、函数的调用
函数名 (实参列表);

(4)、参数的传递:   
	1、复制实参传递
	
	int func(int a,int b)

	func(x,y);

	2、实参地址方式传递
	
	int func(int *a,int *b)

	func(&x,&y);

(5)、函数指针
	本质:一个指针,指向一个函数。

	函数名 :1、代指这个函数   2、函数代码块的首地址

	函数指针的定义:
	返回值类型     (* 指针变量名) (形参列表) ;

	函数指针操作: 1、赋值,建立指向关系  2、取指向的函数
	
	 p = 函数名。  p 指向函数

	void func1(  void (*fp)(void) , char a ); 回调函数

数组   函数  指针 

函数指针数组:
	本质是数组,数组元素是指针,指针指向函数;   void  (int)
	
定义: void    (*fpa[])(int);

递归函数:

自己调用自己,每次调用缩小规模,到达临界值,确定的临界值,依次返回;

本质: 对栈区内存的使用;


求 1+2 .... n;  和?
使用递归求解。
int sum(int n)
{
	if(n == 1) return 1;
	if(n > 1)  return n+ sum(n-1);
}	
n (返回值) 
int  sum(int n)  an+a(n-1)+sum(n-2) .... sum(n-n+1) + 1  临界值	
1、n!

2、    1  2  3  5   8  13 .....   斐波那契数列
	n  1  2  3  4   5  6     n    n = 20

	an = a(n-1) + a(n-2);

结构体:

结构体:是一种构造数据类型。						基本数据类型  int char  *
	由一个或多个基本数据类型构造而成的数据类型

定义一个结构体类型:
struct 结构类型名
{
	成员1;   
	成员2;
	..
};

定义一个结构体类型变量:

struct 结构类型名
{
	成员1;   
	成员2;
	..
}结构体变量名;

给类型取别名:

typedef 原类型名  别名;

初始化:
struct 结构类型名
{
	成员1;   
	成员2;
	..
}结构体变量名 = {成员1的值,成员2的值,,....};




使用:
结构体不能整体使用,必须进入结构体,使用成员。
使用方法:
结构体名.成员

当两个结构体类型完全一致的变量,直接赋值;

结构体的数据存放:

1、按成员顺序依次存放。
2、满足字节对齐要求。   编译器决定
	开辟结构体空间时,最小的开辟单位,4字节对齐。   2字节对齐   单字节对齐。
	空间使用,遵循紧凑原则。

结构体指针:

本质:是一个指针,指向结构体;

定义:  结构体数据类型 *结构体指针变量名;
	struct  st *stp = &st1;

使用: 引用结构体成员
	方式1:  (*stp).成员;
	方式2:  结构体指针专用。
			stp -> 成员;

结构体数组:

本质:是数组,数组元素是结构体。

定义结构体数组:
struct st sta[3];

结构体指针数组:

本质:是一个数组,元素是结构体指针。
定义:
struct st *stpa[3];
使用:
(stpa[1])->成员;

结构体数组指针:

本质:是一个指针,指向数组,数组元素是结构体。

定义:
struct st	(*stap)[4];

((*stap)[0]).成员


数组   结构体 函数  指针;


结构体中有特殊的成员;
结构体指针;
结构体指针数组;

共用体:

跟结构体类似,存储空间共用。空间的大小由最大的成员决定。

定义共用体类型:
union   共用体类型名
{
	成员1;
	成员2;
	...
};

共用体使用:
跟结构体完全一致;

字节序:

对于多字节数据,超过一个字节的基本数据类型。  int short double float 
大端:数据的高位存放在内存的高地址,低位在低地址    PC x86架构 amd  CPU
小端:数据的高位存放在内存的低地址,低位在高地址    ARM 架构   
有CPU的架构决定。

网络编程。

堆区动态内存分配:

堆的特性:1、需要手动开辟和释放空间。
	2、堆区内存:
	生命周期:从你申请开始到释放或程序结束而结束。
	作用域:  得到指针的范围。

使用:

1、必须先手动申请才能使用。

	申请:
	头文件:#include <stdlib.h>
	
	void *malloc(size_t size);
函数5要素:
1、作用:申请堆区内存。
2、函数原型:
3、参数:
	size:表示要申请的堆区内存的大小,字节。
4、返回值:
	void *:万能指针,成功,返回一个指针,指向一片堆区空间。
		失败: NULL
5、注意事项;

2释放空间:

	void free(void *ptr);
		ptr = NULL;
	ptr:需要释放的堆区空间指针。
	注意事项:
		1、不能重复释放
		2、不能释放一部分。

内存泄漏:
	原因:申请的空间的指针丢失。


结构体指针数组[100]; 

动态内存:
	存放学生详细信息。


struct st* add(char *name,int ID,int high,float weight)
{
	malloc 
}

makefile 工程管理器:

规则文件:描述编译过程。 makefile  Makefile

格式:

目标:依赖
由依赖生成目标的规则

伪目标:
	不需要依赖的目标

变量:

变量定义的两种方式   自定义变量:
1、递归展开方式VAR=var
2、简单方式 VAR:=var
3、VAR?=var   变量若存在则不做任何操作。
	变量名+= 值  表示在变量的末尾追加值

自动变量:

	$*   不包含扩展名的目标文件名称   
	$+   所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
	$<    第一个依赖文件的名称
	$?    所有时间戳比目标文件晚的的依赖文件,并以空格分开
	$@  目标文件的完整名称
	$^     所有不重复的目标依赖文件,以空格分开
	$%    如果目标是归档成员,则该变量表示目标的归档成员名称

make -f file 读入当前目录下的file文件作为Makefile

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C高级笔记总结 的相关文章

  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • 如何在 Bash 中给定超时后终止子进程?

    我有一个 bash 脚本 它启动一个子进程 该进程时不时地崩溃 实际上是挂起 而且没有明显的原因 闭源 所以我对此无能为力 因此 我希望能够在给定的时间内启动此进程 如果在给定的时间内没有成功返回 则将其终止 有没有simple and r
  • Gtk-ERROR **:检测到 GTK+ 2.x 符号

    我正在使用 gcc 编译我的 c 应用程序 并使用以下标志 gcc evis c pkg config cflags libs gtk 2 0 libs clutter gtk 1 0 libs gthread 2 0 Wall o evi
  • “make install”将库安装在 /usr/lib 而不是 /usr/lib64

    我正在尝试在 64 位 CentOS 7 2 上构建并安装一个库 为了这个目的我正在跑步 cmake DCMAKE BUILD TYPE Release DCMAKE INSTALL PREFIX usr DCMAKE C COMPILER
  • php exec 返回的结果比直接进入命令行要少

    我有一个 exec 命令 它的行为与通过 Penguinet 给 linux 的相同命令不同 res exec cd mnt mydirectory zcat log file gz echo res 当将命令直接放入命令行时 我在日志文件
  • 我如何知道 C 程序的可执行文件是在前台还是后台运行?

    在我的 C 程序中 我想知道我的可执行文件是否像这样在前台运行 a out 或者像这样 a out 如果你是前台工作 getpgrp tcgetpgrp STDOUT FILENO or STDIN FILENO or STDERR FIL
  • 监视目录的更改

    很像一个类似的问题 https stackoverflow com questions 112276 directory modification monitoring 我正在尝试监视 Linux 机器上的目录以添加新文件 并希望在这些新文
  • Windows CE 与嵌入式 Linux [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 现在我确信我们都清楚 Linux 与 Windows 桌面的相对优点 然而 我对嵌入式开发世界的了解却少得多 我主要对行业解决方案感兴
  • 在 C++ linux 中将 STRINGS 写入串口

    我知道这个问题遍布互联网 但仍然没有任何东西能让我完全解决这个问题 我想用 C linux 将数据写入 Propeller 板的串行端口 从控制台获取输入时程序运行良好 但是当我向它写入字符串时总是返回 ERROR Invalid comm
  • 捕获实时流量时如何开启纳秒精度?

    如何告诉 libpcap v1 6 2 将纳秒值存储在struct pcap pkthdr ts tv usec 而不是微秒值 捕获实时数据包时 Note This question is similar to How to enable
  • 为什么C Clock()返回0

    我有这样的事情 clock t start end start clock something else end clock printf nClock cycles are d d n start end 我总是得到输出 时钟周期是 0
  • 无法在 Perl 中找到 DBI.pm 模块

    我使用的是 CentOS 并且已经安装了 Perl 5 20 并且默认情况下存在 Perl 5 10 我正在使用 Perl 5 20 版本来执行 Perl 代码 我尝试使用 DBI 模块并收到此错误 root localhost perl
  • Python 脚本作为 Linux 服务/守护进程

    Hallo 我试图让 python 脚本作为服务 守护进程 在 ubuntu linux 上运行 网络上存在多种解决方案 例如 http pypi python org pypi python daemon http pypi python
  • 后台分叉无法正常工作[重复]

    这个问题在这里已经有答案了 我运行这个程序 在前景和背景中 int main int pid printf App Start pid d n getpid while 1 pid fork if pid 0 printf Child n
  • 如何从 PROC 获取有关子进程的信息

    我正在尝试编写一个以几个进程作为参数的程序 然后父进程执行每个子进程并打印出一些相关的统计信息 示例 generate ls l 将生成一个程序 打印出有关 ls l 的一些统计信息 特别是其系统时间 用户时间和上下文切换次数 我不想使用
  • vagrant ssh -c 并在连接关闭后保持后台进程运行

    我正在编写一个脚本来启动和后台流浪机器内的进程 似乎每次脚本结束和 ssh 会话结束时 后台进程也会结束 这是我正在运行的命令 vagrant ssh c cd vagrant src nohup python hello py gt he
  • Linux中使用管道进行进程间通信

    我已经编写了在 linux 中写入数字以进行管道传输的代码 如下所示 但显示错误 任何人都可以帮助我解决这个问题 基本上该程序的问题陈述如下 一个程序将打开一个管道 向管道写入一个数字 其他程序将打开同一管道 读取数字并打印它们 关闭两个管
  • C:如果文件描述符被删除,阻塞读取应该返回

    我正在以阻塞的方式从设备 文件描述符中读取 可能会发生这样的情况 在不同的线程中 设备被关闭并且文件描述符被删除 不幸的是 读取没有返回或注意到并且一直阻塞 作为一种解决方法 我可以使用 select 作为超时来执行 while 循环 如果
  • X11 模式对话框

    如何使用 Xlib 在 X11 中创建模式对话框 模态对话框是一个位于应用程序其他窗口之上的窗口 就像瞬态窗口一样 并且拒绝将焦点给予应用程序的其他窗口 在 Windows 中 当试图从模态窗口夺取焦点时 模态也会通过闪 烁模态窗口的标题栏

随机推荐

  • Uoj 33 树上GCD (树分治)

    include
  • RabbitMQ:Queue的介绍和使用

    1 声明 当前内容用于本人学习和使用当前的Queue 当前内容为RabbitMQ中对Queue的介绍 当前内容来源 RabbitMQ中的Queue 2 Queue的官方介绍 首先先分析以下前面的Queue的使用 其实这个东西就是一个队列 一
  • Qt项目中头文件无法找到的几个解决办法

    项目场景 在新建项目中引用头文件 问题描述 头文件无法找到 系统提示错误 file not found 原因分析 可能是头文件写错 也可能是路径有问题 解决方案 三种解决方法 1 检查头文件是否写错 注意新旧版本的差异 2 检查路径是否为全
  • Windows下Python加载VLC的方法

    从网上看到一篇文章 Python 流媒体播放器 基于VLC 其中提到windows下开发VLC需要首先安装VLC 否则就需要设置环境变量PYTHON VLC MODULE PATH 但是我尝试了一下 没有成功 但是 这篇文章给了我一个思路
  • 剑指 Offer 25. 合并两个排序的链表

    题目链接 25 合并两个排序的链表 思路分析 利用归并排序的归并思想 Definition for singly linked list struct ListNode int val ListNode next ListNode int
  • 2021中国WMS市场发展趋势和特点

    仓储行业经历了30多年的发展 正在由手工仓向数字仓 智能仓转变 而在这个过程中 作为指挥硬件设备的 大脑 WMS起着不可或缺的作用 WMS系统通过数字化仓库作业过程管控 借助条码化和智能化技术手段 实现仓库作业条码化 作业过程透明化 库存管
  • 【满分】【华为OD机试真题2023 JS】红黑图

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 红黑图 知识点枚举 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 众所周知红黑树是一种平衡树 它最突出的特性就是不能有两个相邻的红色节点 那我们定义一个红黑图
  • shardingsphere引发 java.lang.String cannot be cast to java.lang.Integer异常

    错误描述 mysql数据库查询sql在数据库连接工具中可以正常运行 在加入了shardingsphere的jar包的项目中抛如下异常 java lang ClassCastException java lang String cannot
  • shell脚本循环传值_Shell 脚本的循环控制(for/while/until)

    熟悉其他高级语言的伙伴们肯定了解循环控制语法是编程中非常基础的内容 今天就介绍Shell 中设计循环控制的语法 for while until 等内容 for 命令 for 命令是最简单的循环控制语句 它的格式为 for var in li
  • SyntaxError: Cannot use import statement outside a module

    Node 生态包含两个不同的模块系统 ESM ECMAScript 模块 和 CommonJS 两个模块系统彼此不兼容 其是 SyntaxError 无法在模块外部使用 import 语句 错误 错误 SyntaxError 无法在模块外部
  • C++ 好用的格式化库--fmt

    背景 fmt 库是一个开源的 C 格式化库 它提供了一种简洁 安全和高效的方式来进行字符串格式化 该库的设计目标是提供与 Python 的字符串格式化语法类似的功能 同时保持 C 的类型安全性和性能 下载与安装 官网下载 fmt 官网地址
  • springboot+jsp教育机构OA系统(源码免费获取+论文+答辩PPT)

    技术架构 springboot mybatis springmvc jsp mysql 功能模块 整个系统分为三种角色 1 系统管理员 2 上级角色 3 普通教师 其中系统管理员需要的功能 部门人员管理功能 档案信息的添加 工作管理功能 上
  • python爬虫案例-跳过百度验证,接口调用实现百度搜索功能

    需求背景 我们有自己的平台 但是希望在我们的平台上面想要实现一个百度搜索的接口 输入想要搜索的内容 模拟百度搜索 将返回的内容再展现在我们自己的平台中 提供给用户查看 coding utf8 import hashlib import ra
  • QT自定义类型作为槽函数的参数

    QT自定义类型作为槽函数的参数 正常情况下信号与槽之间只能传递通用数据类型 如 int 像QVector
  • 数据结构——小白入门篇

    数据结构 小白入门篇 浅谈学习心得 我为什么想要学数据结构 在计算机界有这样一个万能公式 数据结构 算法 程序 在如今这计算机引领风骚的时代 不学数据结构 你凭什么想要做时代的弄潮儿 所以我毅然决然的提前自学了数据结构 学习数据结构前的我是
  • vue3 中使用 element UI 3 (vite 和 webpack)

    Element Plus官方文档 一 安装 NPM npm install element plus save Yarn yarn add element plus pnpm pnpm install element plus 如果您的网络
  • 15个高清壁纸网站推荐

    15个高清壁纸网站推荐 给大家推荐个人比较喜欢的几个壁纸高质量壁纸网站 给大家推荐个人比较喜欢的几个壁纸高质量壁纸网站 极简壁纸 推荐 WallpaperCave CGWALLPAPERS 游戏壁纸 H128壁纸 Magdeleine Up
  • DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白

    在开场白之前的说明 这是 DirectX 9 0c游戏开发手记 的第一部分 叫做 龙书 第二版学习笔记 讲的是我做 龙书 第二版 原名Introduction to 3D GameProgramming with DirectX 9 0c
  • 浅析单向tvs管和双向tvs管的对比,谁能更胜一筹

    瞬态抑制二极管 TransientVoltageSuppressor 简称TVS管 是一种二极管形式的高效能保护器件 当TVS管的两极受到反向瞬态高能量冲击时 它能以10的负12次方秒量级的速度 将其两极间的高阻抗变为低阻抗 吸收高达数千瓦
  • C高级笔记总结

    GCC 1 gcc 组件 1 分析器 分析语法结构 将C语言编译汇编语言 s 2 汇编器 将汇编代码编译成二进制文件 3 链接器 链接目标文件以及库文件 生成可执行代码 4 标准C库 提供核心的C库函数 scanf printf 2 gcc