C基础知识
- linux中所有的shell指令都是针对当前工作目录的文件。如果终端所处的目录与需要操作的文件所在的目录不一致时,需要为需要操作的文件名前加上详细的路径信息,这个路径信息可以是绝对路径也可以是相对路径。
绝对路径:绝对路径的起始点一定是根目录。
相对路径:相对路径起始点为当前工作目录。 - vim的配置:
使用vim ~/.vimrc
在家目录下创建一个vim的配置文件。
内部配置:
syntax on
set mouse=a
set nu
set tabstop=4
set cursorline
set ruler
set autoindent
- 编译及运行一个c语言程序:
gcc 待编译.c文件名
成功编译后生成一个默认的名为a.out的可执行文件
使用./
可执行文件名执行一个可执行文件。./
可以替换成详细的路径 - 计算内存空间:
1gb = 1024 mb
1mb = 1024 kb
1kb = 1024 byte(字节)
1byte = 8bit(位)
bit是内存的最小单位:一个bit只能存放0或者1
一个整型数据,在64位/32位的计算机c语言系统,占据4个字节内存大小,也就是说一共有32位可以用来存放0/1二进制数
计算机会为每一个字节的内存空间编排一个独特的数据编号,该数据编号是一个十六进制的数(0x开头的数据就是十六进制),我们把这么一个十六进制的编号称为内存地址
当访问一个数据的时候,无论采用何种形式进行访问,肯定只能访问到该数据的第一个字节的地址。
系统如何在只拥有第一个字节的地址的情况,准确的判断之后多少个字节是属于该数据的,必须一同访问:根据该数据的数据类型进行判断,如果是整型,那么连带首字节地址一共需要访问4个字节。同理如果是字符型数据,则连带首字节地址一共需要访问1个字节。 - 常量:一个不能改变的固定的数值
变量:用来保存一个数据的量,但是可以随时改变
为了实现重复访问同一段内存空间上的值,通常采用两种手段:
①:完全记忆内存空间的地址
②:为该内存空间取一个别名,那么当我们访问该别名的时候,就等于访问了整段内存空间上的值。我们把内存空间的别名称为变量。
变量的使用方式:变量名虽然可以随意选取,但是在一个变量使用之前,一定要告诉系统该变量的数据类型是什么类型。
我们把告诉系统变量的数据类型这个过程称为声明变量。
如何声明一个变量:
数据类型+变量名;
(我的笔记中所有’+'都代表代码中的空格) - 在编程语言当中,一定要区分开表示数值相等的符号与赋值运算符=的区别。使用变量来保存一个数据,则在整个程序中,该变量只会有一份
变量声明与初始化
#include<stdio.h>
int main(){
int a = 5;//声明变量a,并将他初始化成5
/*
以上代码中,=号并不代表=号两侧的数据大小相等
这里的=都不能构成一个数学表达式:
什么是数学表达式:数学表达式最大的特点就是:该表达式总是能得到一个对应的数值。例如2+3即使一个数学表达式,他得到的结果就是5,2>3同样也是一个数学表达式,他得到的结果就是0
这里的=我们必须看做一个操作:读取等号右侧的值,读取完成后写入等号左侧的数据当中。
*/
//5 = 6;这句代码是错的,因为6是常量,他可以读取,但是5也是常量,他不能写入,所以不能放在等号的左侧。
return 0;
}
while(1);死循环函数
#include<stdio.h>
int main(){
printf("hello world\n");
/*
printf函数会将字符串中的内容输出到标准输出流上(标准输出流即终端)
字符串:由若干个字符拼接而成的数据
c语言中:使用''括起来的内容,就是单个字符
使用""括起来的内容,就是字符串
*/
/*
在编程中,总想/总会使用到某些不可见字符,为了使用这些不可见字符,我们人为为这些不可见字符编排了特殊符号,我们称这些特殊符号为转义字符:
tab(缩进功能):使用'\t'表示
enter(换行功能):使用'\n'表示
backspace(退格功能):使用'\b'表示
\b 仅仅退格,并不会删除数据
*/
while(1);
return 0;
}
fflush(stdout);手动刷新函数
#include<stdio.h>
#include<unistd.h>
int main(){
printf("hello world\b");
fflush(stdout);
while(1);
return 0;
}
printf函数:将()内的字符串输出到终端上。
但是,其实printf是先将字符串输出到缓存区内(中间商),然后只有当缓存区刷新时,缓存区的内内容才会出现在终端上。
如何刷新printf的缓存区:
①当遇到’\n’的时候,缓存区刷新
②当缓存区满时刷新
③当程序结束时刷新
④#include<unistd.h>
使用fflush(stdout);
手动刷新。
sleep();休眠函数
/*
保证程序不会结束
先在终端上打印__-__-__
然后间隔2秒后,将第一组__改成10,也就是终端会从__-__-__变成10-__-__
再间隔2秒后,将第二组__改成20,也就是终端会从10-__-__变成10-20-__
再间隔2秒后,将第三组__改成30,也就是终端会从10-20-__变成10-20-30
*/
#include<stdio.h>
#include<unistd.h>
int main(){
printf("__-__-__");
fflush(stdout);
sleep(2);
printf("\033[8D10\033[1C");
/*
\033[nD,代表光标向左移动n个位置
\033[nC,代表光标向右移动n个位置
\033[nA,代表光标向上移动n个位置
\033[nB,代表光标向下移动n个位置
*/
fflush(stdout);
sleep(2);
printf("20\033[1C");
fflush(stdout);
sleep(2);
printf("30");
fflush(stdout);
while(1);
return 0;
}
#include<unistd.h>
使用sleep();
%d 占位符
#include<stdio.h>
int main(){
int a = 10;
int b = 15;
printf("a = %d,b = %d\n",a,110);
/*
如果想在printf中输出一个变量的值,那么只能在字符串中放入字符串能够理解的变量。
我们把字符串中的变量称为格式占位符:
使用 :%d来对所有的整型数据进行占位
*/
return 0;
}
scanf();标准输入函数
#include<stdio.h>
int main(){
/*
printf是将内存中的数据输出到终端上。
那么如何将终端上输入的数据保存到内存中:通过scanf函数
*/
int a = 0 , b = 0;
scanf("%d%d",&a,&b);
printf("a = %d,b = %d\n",a,b);
/*
scanf函数,用来保存终端输入数据的变量,必须使用&来修饰
&:取地址符号,他也是一个运算符,被&运算符修饰的变量与&形成了一个数学表达式。该表达式的结果为该变量所代表的内存空间的第一个字节的地址
scanf的字符串中,尽量只写格式占位符。因为scanf是一个格式化的输入函数
*/
return 0;
}