Liunx系统下c语言的学习
注意事项
C语言的基础语法
基本语法
- 基本字符集
- 标识符的命名规则
- 32个关键字
- 分隔符
- 数据类型
- 基本数据类型
- 其他数据类型
- 常量与变量
- 常量
- 变量
- 运算符与表达式
- 算数运算符
- 关系运算符
- 逻辑运算符
- 赋值运算
- 条件运算符
- 逗号运算符
- 长度测试运算符
- 运算符的优先级
- 数据类型的转换
- 强制类型转换
- 自动类型转换
环境变量
环境变量是什么?简单来说就是制定一个目录,运行软件的时候,相关的程序将会按照该目录寻找相关文件。设置变量对于一般人最实用的功能是不用拷贝dll文件到系统目录中,而path这一系统变量就是系统搜索dll文件的一系列路径
makeFile (分文件)的编写
Makefile文件中描述了整个软件工程的 编译规则和各个文件之间的依赖关系
-
使用的原因:为了更好的编译项目,清晰快捷的整理源文件,提高效率
-
make工具可以将大型的开发项目分成若干个模块
-
第一行想要输出的文件不能一步到位,需要依赖与其他,因此在下面可以继续这样子写。(所有依赖写好之后,才会执行最终的文件)
-
.c文件:主要的每个代码块都在c文件中
-
.h文件:每个c文件都跟着一个h文件。h文件的作用是放着c文件中函数的声明,结构体的定义等
-
.o文件:目标文件,每个文件经过编译都会形成一个目标文件(二进制文件)多个目标文件链接后,才能形成可执行文件
-c只进行预处理,编译,和汇编:-c生成.o文件,只编译并生成目标文件。
-
当我们想计算两个数的和时
主文件main.c
#include <stdio.h>
#include “sumFun.h”
int main()
{
//输入
int a;int b;
scanf("%d%d",&a,&b);
//执行
int sum = sumFun(a,b);
//输出
printf(“the value is the %d”,sum);
}头文件sumFun.h:数据类型+方法+参数
int sumFn(int a,int b);
C文件:sumFun.c
int sumFun(int a,int b){
int sum= a+b;
return sum;
}Markfile:
main.out:main.c sunFun.o
gcc main.c sunFun.o -o main.out
sunFun.o:sunFun.c
gcc -c sunFun.c封装一个函数,直接使用命令就可以输出
-
main.c
#include <stdio.h>
int main (int a,char *b[]){
int i=1;
for(i;i<a;i++){
if(i==a-1)printf("%s\n",b[i]);
else{
printf("%s ",b[i]);
}
}
return 0;
} -
编译:gcc main.c -o myecho
-
配置全局变量:
-
第一步:在当前路径下,在配置全局变量
sudo mv myecho /usr/bin
-
第二步:返回根目录,输入myecho 便可以直接使用。
-
-
main 函数详解
#include <sdio.h>
int main(it argc,char *argv[]){
return 0;
}
- argv:是字符指针的数组,每个元素都是一个字符指针,指向一个字符串,即命令中的每一个参数
- argc:用于存放命令行参数的个数
- main函数返回值用于说明程序的退出状态,如果返回0,则代表正常退出,否则代表程序异常退出,可利用echo $?输出为0那么是正常的,如果是其他数字那么发生了错误
输入输出流和错误流
stdin
程序的输入:键盘输入
stdout
程序的输出:终端输出
stderr
程序错误的输出:错误输出
重定向 >>
可以改变文件输出的方式,-
将文件保存在另一个文件中
管道原理及应用
利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。
原理:管道实际上在内核创建了一个i node,和一个指向它的固定大小内核缓冲区(可以理解为类似cache,但读写不分开),传入的两个文件描述符就都指向这段缓冲区,这样读管道的0文件描述符和写它的1文件描述符,就好像读写这个文件一样,实现了进程间的通信。
存在的作用:
- 过滤
- 查看数据
- 查看通信状态
查看指定目录下包含 'c’的内容:ls /home/xiao/home/ | grep c
查看当前在运行的进程:ps -e
查看当前在运行的进程包含’ssh’的进程:ps -e | grep ssh
指针与内存
-
为什么32位系统是4G内存:
32位操作系统安装在32位电脑中,32位电脑的CPU是32位,即地址总线是32根,CPU处理程序,发出指令给到地址总线(地址总线的作用是传递地址到寻址空间——寻找地址)因为地址总线有32根,所以可以传递出2的32次方中结果,寻址空间会根据这个结果在内存中寻找对应的编号(在开机的时候操作系统就会为内存中的每一个字节进行编号,这个标号即为地址),一个编号对应的是一个字节所以可以寻找到2的32此方个字节(即4G),所以该电脑只能寻找到4G内存,所以32位系统只“需要”管理4G内存,所以32位操作系统在开机的时候只会给4G内存编号,即通俗表达“32位操作系统只能管理4G内存”。
-
计算机最小的单位是字节,一字节等于8个2进制位
-
操作系统中的寻址空间去寻找地址,两个条件,存在这个东西,找这个东西的条件
-
操作系统的作用:分配内存,管理内存
-
变量的本质是内存,指针的本质是内存地址,指针是一种数据类型,变量名的本质就是一个地址;
-
操作系统是如何管理内存的?
-
系统内核
-
栈
-
可分配内存
-
堆
-
代码段在哪里?函数放在代码段,函数的本质就是指针,每个函数的执行记录是存放到栈中
-
数据段:常量,全局变量
- 我们要明白的是*永远指向的都是地址
-
-
#include <stdion.h>
int main()
{
int i =10;
int p = &i;//指针p指向i的地址,因此星p的值等于10;
int **p = &p;//将星星p看作为一个星(星p)整体,&p等于i的值,然后星p=i=10,内存中没有这个东西,因此会发生错误
}
-
p[3]=101;它的意思是说指针p往下走三个的内存是101;
-
强类型,弱类型,根据内存存储的内容,如果根据内存可以判断那么就为强类型,否则为弱类型;c语言是弱类型,举例:当我们编辑的时候,输入,阿斯他妈a与65是不能够相互辨别的,有数据类型限制的是静态声明,否则为动态声明,
gbd调试工具的使用
-
出现:linux 下 gdb没有符号表被读取。请使用"file" 命令当我们想调式代码的时候,要使用-g选项,这个是指为了获得有关调试信息,要用gdb进行调试,必须使用-g生成二进制可执行文件
方法:1.删除该程序原有的可执行文件
2.gcc -g example.c -o example.out
这样就可以了,用gdb调用example救木有问题鸟。
-
一开始:gdb +调试的文件名 :gbd ./example.out
-
start:调试开始
-
l:将代码显示出来,当显示不完全的时候,回车即可
-
p +变量的名字:打印变量的值
-
n:往下走
-
s:进人函数
-
f +函数的编号:进人这个函数
-
bt:显示栈
-
break +行号:打断点
-