首页 > 系统相关 >一周课程学习总结1【关于Linux和c语言程序设计】

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

时间:2023-07-01 14:12:13浏览次数:40  
标签:main int Linux char 课程 printf 程序设计 include 光标

前言

这周是我正式开始学习嵌入式的第一周,首先学习了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码值。

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

标签:main,int,Linux,char,课程,printf,程序设计,include,光标
From: https://www.cnblogs.com/m9yu/p/zongjie1.html

相关文章

  • Linux常用操作
    Linux常用文件操作Linux常用文件操作目录简介cdusr切换到该目录下usr目录cd../切换到上一层目录cd/切换到系统根目录cd~切换到用户主目录cd-切换到上一个所在目录su或suroot进入root上下文su<用户名>......
  • linux内存管理 rsyslog进程占用高内存
    rsyslog进程占用内存巨高发生险情后,立即进行排查,发现有1个节点还没有完全僵死,还能连上,只是非常卡,现象是1、内存被完全耗尽,系统swap被占用超过80%,操作非常卡顿2、负载贼高,16核的机器负载达到120+3、除了业务的进程占用内存高之外,还有一个进程占用内存也很高,rsyslogd4、osd进......
  • 关于Linux-Kernel-Live-patching-的效果演示-kpatch auto-配置
    本文为了演示出效果,准备了如下的环境操作系统:RedHatEnterpriseLinuxrelease8.7(Ootpa)内核版本:4.18.0-372.9.1.el8.x86_64 1、关于操作系统版本、内核、内核相关的软件包版本,情况如下:[root@qq-5201351~]#cat/etc/redhat-releaseRedHatEnterpriseLinuxrelease......
  • postgresql 14安装步骤(linux)
     ps:(跟别人视频看的,有坑,记得全看完)打开官网https://www.postgresql.org/download/linux/redhat/选择需要数据库的版本,虚拟机系统根据官方文档的步骤安装即可(我用的是postgresql14+centos7,主要是学习测试使用)  按照步骤安装:(yum)1.配置yum源sudoyuminstall-y......
  • Linux Shell文本处理
    预计更新1:基础知识简介和安装基本命令变量和环境变量2:流程控制条件语句循环语句函数3:文件处理文件读写文件权限和所有权文件搜索和替换4:网络和进程网络通信进程管理信号处理5:文本处理正则表达式文本分析和处理生成报告和日志6:用户界面命令行参数和选......
  • Linux Shell基础知识
    预计更新1:基础知识简介和安装基本命令变量和环境变量2:流程控制条件语句循环语句函数3:文件处理文件读写文件权限和所有权文件搜索和替换4:网络和进程网络通信进程管理信号处理5:文本处理正则表达式文本分析和处理生成报告和日志6:用户界面命令行参数和选......
  • Linux Shell流程控制
    预计更新1:基础知识简介和安装基本命令变量和环境变量2:流程控制条件语句循环语句函数3:文件处理文件读写文件权限和所有权文件搜索和替换4:网络和进程网络通信进程管理信号处理5:文本处理正则表达式文本分析和处理生成报告和日志6:用户界面命令行参数和选......
  • Linux主流架构运维工作简单剖析
    随着IT运维的不断发展,尤其的Linux的飞速发展,越来越多的企业开始使用Linux操作系统平台,例如CentOS、RedHat、Ubuntu、Fedora等等,成千上亿个网站涌现在当今互联网,互联网已经成为必不可少的工具,那今天我们跟大家一起来分享讨论目前用的最多的Linux下主流网站架构。随着IT运维......
  • Linux Shell文件处理
    预计更新1:基础知识简介和安装基本命令变量和环境变量2:流程控制条件语句循环语句函数3:文件处理文件读写文件权限和所有权文件搜索和替换4:网络和进程网络通信进程管理信号处理5:文本处理正则表达式文本分析和处理生成报告和日志6:用户界面命令行参数和选......
  • linux-tina-编译篇
    此篇对于网上搜寻的t113内核编译的整合篇:参考链接:芒果派百问网百问网是不能操作文件系统的,即是只读模式。芒果派也多多少少有很多的问题。下载与解压:这里以芒果派为例子,我是用百度盘下载的,git国内的网实在是更新不了。更新之后按照要求解压tarxvzfTinna..   然......