第一周课程学习总结【关于Linux和c语言程序设计】

本文介绍了作者学习嵌入式系统的第一周心得,主要内容包括Linux的优点、常用命令,C语言的基础知识如程序结构、数据类型、文件类型,以及printf函数的使用。同时,文章还涉及了国产操作系统、vi编辑器的使用和一些编程技巧。
摘要由CSDN通过智能技术生成

前言

这周是我正式开始学习嵌入式的第一周,首先学习了c语言环境的安装,简单的了解了Linux,然后学习了c语言程序设计的部分内容。下面是对这周学习内容的一些总结和我的个人理解,如有不对之处还请指出。

Linux

Linux优点:

1)开放性;

2)完全免费;

3)多用户;

4)多任务;

5)良好的用户界面;

6)设备独立性;

7)提供了丰富的网络功能;

8)可靠的系统安全性;

9)良好的可移植性;

国产操作系统

统信UOS

麒麟OS

Linux常用命令

这里列出了一部分

ls -l:以列表形式显示文件详细信息
ls -a:显示指定目录下所有子目录与文件,包括隐藏文件
cd:切换工作目录
cp:拷贝文件,将给出的文件或目录复制到另一个文件或目录中
mv:移动文件,用户可以使用mv命令来移动文件或目录,也可以给文件或目录重命名
touch:用于修改文件或者目录的时间属性,包括访问时间和修改时间,若文件不存在,系统会建立一个新的文件
mkdir:创建目录,参数-p可递归创建目录
pwd:显示当前路径
clear:清屏(快捷键:ctrl+l)

命令使用技巧

~:表示家目录
/:根目录
./:当前目录
../:上一级目录
双击Tab建:自动补全内容,如果没有提示表示路径错误
选中内容表示复制,按滚轮表示粘贴内容
ctrl+shift+加号:终端界面变大
ctrl+减号:终端界面变小

文件类型

-:普通文件 例如 : .txt .doc .c .cpp 音视频文件,图片文件...
d:目录文件(文件夹)
p:管道文件(进程间通信,两个程序之间通信,只能在同一台主机上通信)
s:套接字文件(网络文件,进程间通信,两个程序之间通信,可以在不同主机上通信)
c:字符设备文件(驱动文件)
b:块设备文件(驱动文件)
l:软链接文件(快捷方式)
总结:
linux有七种类型的文件
在linux中,一切皆文件

C语言

c语言是让人与机器沟通的桥梁

程序的组成

下面以程序为例

//没有头文件不会出现编译错误,但是会出现编译警告,提示隐式声明
//extern的意思是函数声明,告诉编译器等一下我使用printf的时候不要警告
//extern int printf(const char *_restrict_format,...);
#include <stdio.h>
//main是程序的入口地址,是老板
int main()
{//程序工作的范围,边界,不能离开{}独立工作,所以一个工程只有一个main
    //函数,函数其实就是帮助我们实现某个功能
    //printf帮我们输出hello到屏幕
    printf("hello\n")return 0;//程序结束,return 0表示正常退出
}

printf讲解

下面以程序为例

#include <stdio.h>

int main(int srgc,char const *argv[])
{
	printf("hello world\n");
	//%d格式输出符表示输出的内容是整数
	printf("%d,%d\n",100,100);//输出整数
    printf("%c\n",'a');//输出字符
    printf("%s\n","abc");//输出字符串
    printf("%d,%c,%s\n",200,'b',"abc");//输出整数,字符,字符串
    printf("%f\n",3.14);//输出小数
    printf("%lf\n",3.1415926);//输出双精度小数
    printf("%.6lf\n",3.1415926);//%.6表示输出小数点后6位,注意进位
    printf("%p","abc");//输出"abc"的地址
	return 0;
}

可以在 Linux_C函数库中文手册 中查找函数使用方法

头文件<>和""使用区别

在Linux中如下,在windows里在kits找

#include <stdio.h> //<>是系统默认在/usr/include寻找stdio.h这个头文件
#include "stdio.h" //""系统默认在此程序当前目录(文件夹)寻找stdio.h如果找不到会在/usr/include寻找stdio.h这个头文件
[-Wimplicit-function-declaration]

错误:没有头文件

fork函数

这里简要介绍fork函数,可以在man手册中查询fork函数的使用方法

//此程序在ubuntu上运行
#include <stdio.h>
#include <unistd.h>

int main()
{
    /*
    */
    fork(); //复制进程,克隆人,双胞胎
    printf("我是双胞胎\n");
    return 0;
}

在这里插入图片描述

fork函数把一个程序一分为二,每个程序各自做自己的事情

man帮助手册

编程开发过程中,需要使用众多的系统指令,各类函数库、系统调用、各类系统脚本文件等,这些种类繁多、功能各异的信息,可以通过统一的man手册来获取第一手资料,man文档是帮助信息的权威通道,是大多数教程、书籍的知识来源。

使用man手册查询命令、函数时,一般直接在man后面接上待查条目即可,但有时候会遇到同一个待查询的条目存在于多个man分册的情况,这就需要先罗列出该条目所在的分册信息,然后再根据需要去选择帮助文档的序号。

// 查询存在于多个分册的条目:
// 先使用-f来查看有哪些分册包含了条目
gec@ubuntu:~$ man -f printf
printf (1)           - format and print data
printf (3posix)      - print formatted output
// 根据需要,指定查询某一册帮助分册
gec@ubuntu:~$ man 3posix printf

注意:
按 q退出

代码风格

下面以程序为例

  #include <stdio.h>
  
  int main(int argc,char const *argv[])
  {
      printf("总经理\n");
      int a = 10;
      //不管有多少个大括号,内容一定与大括号空4格
      //{}是作用域范围
      {
       	  printf("研发部\n");
          int b=20;
          
          {
              printf("程序员\n");
              printf("a = %d\n",a);
              printf("b = %d\n",b);
          }
      }
      
      {
		  printf("销售部\n");
          {
              printf("销售员\n");
              printf("a = %d\n",a);
              //printf("b = %d\n",b);
          }
      }
      return 0;
  }

vi的使用

直接在 vsCode 中的扩展栏搜索 vim 安装即可。关于 vi 编辑器:

  • 特点:
    1. vi的改进版本叫vim(vi’s improved version),vi和vim是同一个软件。
    2. vi其初衷是解放鼠标,只用键盘高效操作所有的编辑任务。
    3. 没有菜单,操作分成编辑模式和命令模式,除了编辑之外的操作都在命令模式下进行。
  • 模式切换:
    1. 从命令模式 切换到 编辑模式:按i、o、a、I、O、A均可
    2. 从编辑模式 切换到 命令模式:按Esc。

在编辑模式中,vi 就跟普通的编辑器一样
在命令模式中,可以输入如下命令操作文本:

命令效果
:w保存
:wq保存并退出
:q!放弃保存并退出
i在当前光标处插入文本,进入编辑模式
I在当前光标所在行的开头处插入文本,进入编辑模式
a在当前光标的下一个字符处插入文本,进入编辑模式
A在当前光标所在行的末尾处插入文本,进入编辑模式
o在当前光标的下一行插入文本,进入编辑模式
O在当前光标的上一行插入文本,进入编辑模式
yy复制光标所在行
3yy复制光标所在行及以下3行
dd剪切光标所在行
3dd剪切光标所在行及以下3行
x剪切光标所在的字符
r替换当前字符
p粘贴
u撤销
ctrl+r恢复撤销
k光标向上移动
j光标向下移动
h光标向左移动
l光标向右移动(小写的L)

下面是在ubuntu中使用vi,直接输入vi a.c创建一个新文件,然后进行编辑。

在这里插入图片描述

在这里插入图片描述

在编辑模式下写程序时,Tab键默认缩进8格,如何进行修改呢?

​ Tab键缩进8格修改成4格,在命令模式下输入:set ts=4即可

数据类型

  • 什么是数据?

    有用的信息称为数据

int a = 123; // 定义一个专门用来存储整数的变量a
int = 4个字节

int在32位 /64位机中都是4字节

在计算机里面int一定不大于long

int<=long long<=long long

各数据类型大小

下面以程序为例

#include <stdio.h>

int main()
{
    printf("%ldbyte\n",sizeof(char));
    printf("%ldbyte\n",sizeof(short));
    printf("%ldbyte\n",sizeof(int));
    printf("%ldbyte\n",sizeof(long));
    printf("%ldbyte\n",sizeof(long long));
    printf("--------------------\n");
    printf("%ldbyte\n",sizeof(float));
    printf("%ldbyte\n",sizeof(double));//c++只用double
    printf("%ldbyte\n",sizeof(long double));
    return 0;
}

在这里插入图片描述

在这里插入图片描述

如图在不同的系统中有的数据类型大小也不一样

变量的定义

下面以程序为例

#include <stdio.h>

int main(int argc, char const *argv[])
{
    // 申请2个字节空间,并取名为a,俗称定义变量a
    // 空间a的内容为随机数
    // a空间只能存放整数
    // a空间存放的最大值为2字节的数据
    short int a;
    // 在同一个作用域({})下,不能出现两个同名的变量名
    a = 10; // 将10存放到空间a里面

    // 申请空间并将10放到里面
    // 即定义变量并初始化
    short b = 100;
    return 0;
}

输出的格式

下面以程序为例

	short b = 100;
    printf("%hd\n",b);// h的意思为half即int的一半
    
    char c = 15;
    printf("%hhd\n",c);
   
    int d = 1024;
    printf("%d\n",d);// %d既能表示负数也能表示正数

    unsigned int ud = 1024;
    printf("%u\n",ud);// %u为无符号输出

    long int le = 1000L;// L表示1000为长整型
    printf("%ld\n",le);

    long long int lle = 100000LL;
    printf("%lld\n",lle);

    float f = 3.14;
    printf("%f\n",f);

    double lf = 3.1415;
    printf("%lf\n",lf);

    // 在32位机里面,此类型越界无效
    long double llf = 3.1415926;
    printf("%Lf\n",llf);

    int number = 19;
    printf("%#o\n",number);// 八进制输出
    printf("%#x\n",number);// 十六进制输出

注意:

负数在内存中以补码方式存放

正整数:补码与原码一样

  • 这里用以下程序为例进行详细讲解

#include <stdio.h>

int main(int argc, char const *argv[])
{
    unsigned char a = 257;
    char b = 129;
    printf("a:%hhu\n",a);
    printf("b:%hhd\n",b);
    printf("b:%hhu\n",b);

    return 0;
}

%hhd带符号输出,%hhu不带符号输出

在这里插入图片描述

257-->1
范围是0~255,溢出2
1111 1111 +1  ---》  0000 0000 +1  ---》  0000 0001
所以得到1
用汽车里程表表示,最大值和最小值相邻,图示如下(图画的有点丑别介意)

在这里插入图片描述

129-->-127
范围是-128~127,溢出2
0111 1111 +1 ---》1000 0000  +1 ---》1000 0001
1000 0001 最高位是符号位,补码转换成原码后为(符号位不变,取反加一)
1111 1111 即为-127
用汽车里程表表示如下(图画的有点丑但能看明白就好)

在这里插入图片描述

129--->65409
最高位符号位被数据位占用,向前借位,借8位一共16位
根据%hhd算%hhu,在-127的基础上计算
1000 0000 0111 1111 (-127) ---》转换成补码
1111 1111 1000 0000 +1 ---》
1111 1111 1000 0001 = 65409
  • Linux没有借位,符号位就是数据位。

c语言是强类型语言

弱类型语言:不需要手动分配空间,系统自动匹配(进行查找后还是不太明白?python是强类型语言还是弱类型语言?)

unsigned short int a = 10;float b = 3.14;char a
'猫'???一个中文占用3字节--->utf-8
        一个中文占用2个字节--->GBK

进制转换

135(10)—>87(16)—>207(8)

1101 1011(2)–>219(10)

167(8)–>119(10)

E15(16)–>3605(10)

浮点数

浮点数存放在内存中

分为符号位1位,整数位8位,小数位23位,共32位4字节

小数转二进制使用最小二乘法

在这里插入图片描述

在这里插入图片描述

//  不是所有字符都有转义
'\b' : 转义字符 char ,表示退格符
'\t' : 代表Tab键
'\n' : 代表换行
'\r' : 代表光标回到起始位置
1066 : 整型 int short
99.44 : 浮点型 float
0XAA : int 十六进制
2.0e30 : float 科学计数法2.0*10^30
0x00EEABCDUL : unsigned long 十六进制

字符

字符的本质就是单字节的整型

下面以程序为例

#include <stdio.h>

int main(int argc, char const *argv[])
{
    char a = 'a';
    char b = 1;
    char c = a + b;
    printf("%c,%d\n",c,c);// b,98
    char d = a - ' ';
    printf("%c,%d\n",d,' ');// A,32

    return 0;
}

可以查ASCII码表

转义字符

转义字符有范围,在127以内

127(10)—》177(8)

下面以程序为例

#include <stdio.h>

int main(int argc, char const *argv[])
{
    printf("efg\a");
    printf("abcd\b");
    printf("efg\n");
    // 转义字符---八进制'\xxx',注意x的大小位0-7
    // 注意转义字符的范围一定是127以内,不要超出char类型范围
    char a = '\102';// 不超过177
    printf("%o,%d,%c\n",a,a,a);
    //printf("%o\n",'\109');//不合法,单个字符是0-7
    
    //转义字符---十六进制'\xhh',注意x的大小为0-F
    char b = '\x4f';
    printf("%x,%d,%c",b,b,b);

    return 0;
}

在这里插入图片描述

字符串

"abc\0" // 4个字节
'\0'作为结束标记

bool类型

下面以程序为例

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

int main(int argc, char const *argv[])
{
    // 在c语言,非0为真,0为假
    // bool为布尔类型,一般只有两种状态 true: 真 false: 假
    // 作用是作为标志位,增加代码的可读性
    bool flage = true;
    bool flage1 = false;
    printf("%d\n",flage1);

 	enum color{yellow = 10,gree,blue,red}; // 枚举
    printf("%d",yellow);
    printf("%d",red);

    return 0;
}

常量与变量

  • 概念:不可改变的内存称为常量,可以改变的内存称为变量

标准输入与输出

下面以程序为例

#include <stdio.h>

int main(int argc, char const *argv[])
{
    printf("input msg : ");
    int a;
    float b;
    //char msg;
    // &a获取a的地址
    scanf("%d%f",&a,&b);
    printf("show msg : %d,%f\n",a,b);
    return 0;
}
  • scanf:是一个挑剔的人

输入的内容与存放的内容的空间类型一定要严格一致,否则不会取缓冲区的内容

  • getchar():是一个不挑剔的人

它可以将输入缓冲区里面的内容不管什么类型,直接拿走

下面以程序为例

#include <stdio.h>

int main(int argc, char const *argv[])
{
    printf("input msg : ");
    int a;
    float b;
    char c;
    // &a获取a的地址
    // scanf不要添加任何除了格式化字符%外的所有任何字符
    //scanf("%c,%d\n,%f",&c,&a,&b);
    // 取到缓冲区的数据,返回实际取到的内容的个数
    // 取不到缓冲区的数据,返回0
    int n = scanf("%d",&a);
    // 用getchar()将输入缓冲区的内容取走
    char getMsg = getchar();
    printf("n : %d\n",n);
    printf("get msg : %c\n",getMsg);
    scanf("%f",&b);
    scanf("%c",&c);
    printf("show msg : %d,%f,%c\n",a,b,c);
    return 0;
}

在这里插入图片描述

这里需要注意的是,输入时必须将字符a与上一个小数连在一起输,因为如果按了空格在输入a的话,空格’ '也是一个字符会被取走,导致看不见a的输出;这里的get msg是空格并不是没有,因为scanf的内容顺利输出了,getchar就没有数据需要取走,如果将它的定义改为int输出改为%d,将会看到输出32,这是空格符的ASCII码值。

以上就是我本周学习内容的总结,在学习了这些知识之后还需要自己多做练习加强巩固,一起加油吧!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值