一、linux基本命令
ls/cd/pwd ->没有修改系统资源,只是浏览linux系统,所以在任何的路径下都可以使用,没有受到权限限制。
1、 创建普通文件? -> touch
用法: touch + [新文件的路径] + ... -> 既可以是绝对,又可以是相对。
例子1: 假设当前在家目录,想在家目录下创建一个新的文件,名字叫test.c。
相对: touch ./test.c 等价于 touch test.c
绝对: touch /home/gec/test.c
例子2: 假设当前在/home目录,想在根目录下创建一个新的文件,名字叫example.txt。
相对: touch ../example.txt
绝对: touch /example.txt
提示错误: touch: cannot touch `../example.txt': Permission denied -> 权限拒绝!
1)为什么会出现这个错误?
Permission denied -> 因为权限不足导致执行失败!
当前$,代表一个普通用户,在家目录拥有一切的权限,可以在家目录下操作任何的东西都不会受到权限问题。
如果不在家目录下,则如果修改了系统(增加/删除),都会受到权限的拒绝!
2)如果真的需要在家目录以外的路径下创建/删除文件?
方式一:临时切换到超级用户来执行这个命令。 sudo + 命令
gec@ubuntu:/home$ sudo touch ../example.txt
[sudo] password for gec: -> 在linux输入密码,不会回显给用户。
结果: 当前还是一个普通用户。
方式二:切换到超级用户,再执行命令。
gec@ubuntu:/home$ sudo su -> 切换到超级用户
root@ubuntu:/home#
超级管理员名字: root
当前身份: #
root@ubuntu:/home# touch ../test.txt -> 直接执行命令,就不会受到权限干扰。
root@ubuntu:/home# exit -> 切换到普通用户
exit
gec@ubuntu:/home$
2、 删除普通文件? -> rm命令
用法: rm + [需要删除的文件的路径]
假设当前在家目录
练习1: 删除家目录下test.c
rm ./test.c
练习2: 删除根目录下example.txt和test.txt
sudo rm ../../example.txt ../../test.txt -> 可以跟多个文件的路径。
二、编辑C语言程序的工具。
1、 在linux系统下编辑? ---- 使用vi编辑工具。
首先使用vi指定文件的名字,通过模式切换对文件进行编辑。
1)在家目录下指定一个新的文件名字叫test.c。
gec@ubuntu:~$ vi test.c
2)进入vi工具后,首先是"一般模式"。
一般模式的特点:不能够对文本进行编辑,只能通过方向键查看文件内容。
3)按"i"键,切换到"编辑"模式。
编辑模式特点:在底行会出现一个字符串"-INSERT-",在该模式下,随意编辑文本,但是不能够保存文本!
4)想保存退出,只能先按"Esc"切换到一般模式,再按":"切换到底行模式。
w(write) -> 保存
q(quit) -> 退出
底行模式特点: 在底行出现一个":",可以保存退出文本!
=====================================================================================
练习:使用vi来编辑程序。
#include <stdio.h>
int main()
{
printf("helloworld! ");
return 0;
}
======================================================================================
2、 在linux系统下编辑? --- 使用gedit编辑工具。
1)使用gedit指定一个文件的名字。
2)直接编辑,按退出即可!
3、 在windows系统下编辑? --> 使用notepad++编辑工具。
因为在windows编辑完工程之后,需要将文件放置linux下处理,所以需要设置linux与windows的共享目录。
1)确保共享目录路径在windows下存在。
D:GZ1934
2)告诉linux,共享目录在哪里?
虚拟机 -> 设置 -> 选项 -> 共享文件夹 -> 总是启用 -> 添加 -> 下一步 -> 浏览 -> 主机路径:D:GZ1934
--> 下一步 -> 完成 -> 确定
3)使用命令切换到共享目录下路径
cd /mnt/hgfs/
ls -> 看到GZ1934,说明共享成功!
ls -> 没有看到任何,重启虚拟机!
练习1: 成功设置共享目录
练习2: 在02/code/test.c -> 编辑一下
练习3: 在linux与windows删除/创建东西,另外一个系统还在不在!
结论: linux与windows是互通,在linux下操作共享目录下内容,不需要sudo
思考题:
1)能不能在/mnt/hgfs下创建任何东西?
答案:不能,因为这个目录下的内容通过共享设置的,不是通过命令来创建!
2)能不能在共享目录中创建?
答案:能,用户随意创建。
三、分析linux C语言大纲
1、main函数使用事项、基本数据类型、变量定义/赋值、生命周期作用域、运算符,程序编译过程分析。
2、ASCII码,语句/表达式,逗号表达式/三目运算,控制流循环与分支结构。
3、函数定义、调用、声明、函数形式参数与实参之间关系,函数返回值,函数书写规则,函数运行规则。
4、一些特殊函数调用:递归函数、回调函数、变参函数,内联函数
5、数组定义/赋值,数组元素,一维数组、二维数组、整型数组、字符数组,指针数组。
6、指针定义/赋值,指针的数据类型,整型指针,字符指针,数组指针,函数指针,二级指针。
7、结构体定义,结构体变量、结构体指针、结构体变量与指针如何访问结构体的成员,如何计算结构体的空间。
8、联合体、枚举类型、typedef、宏定义、头文件、条件编译、拆分多个.c文件
9、如何申请堆空间?如何释放?
10、字符串函数,计算字符串长度,拷贝字符串到另一块内存空间,追加字符串,比较两个字符串。
四、linux C语言基本框架。
C语言程序入口: main函数 -> main() -> 每一个程序都必须有main函数。
1、main函数有什么特点?
1)程序必须以main作为主函数命名。
2)程序不是从第一个函数开始执行,而是从main函数开始。
3)main函数在程序中有且仅有一个。
2、main函数基本框架?
main() -> 函数头
{ -> 函数体
}
3、linux函数属于一个任务,每一个任务都会一个返回值,返回值就会返回给调用函数的地方。
返回值类型写在函数头前面。
返回值类型 main()
{
...;
...;
return 返回值结果;
}
注意事项:
1)返回值类型可以是基本数据类型,也可以是自定义数据类型。
2)main执行return代表程序的退出,子函数执行了return代表子函数返回,返回到调用的地方。
3)返回值结果必须与返回值类型匹配。
例子:
int fun()
{
...;
return 1; -> 返回到main函数中
}
int main()
{
fun();
return 0; -> 代表程序结果
}
4、头文件
1)程序中一定要添加头文件吗?
不是。如果程序没有调用到任何的函数,则不需要添加头文件,只有当程序调用了函数,才需要添加对应的头文件。
例子:以下例子不需要添加头文件
int main()
{
return 0;
}
2)头文件有什么作用?
对函数进行声明,函数在调用前必须声明,否则就会编译警告!
3)函数对应的头文件是什么?
例子: printf() -> 在Ubuntu终端输入: man 3 printf(按'q'退出) -> 得到对应的头文件: #include <stdio.h>
例子:
#include <stdio.h>
int main()
{
printf("helloworld! ");
return 0;
}
4)头文件不加会有什么问题?
warning: incompatible implicit declaration of built-in function ‘xxxxx’ -> xxxxx这个函数的头文件没有添加!
5、 linux在运行程序时,需要给程序传递一些命令行参数
1)怎么样才能实现命令行传参?
int main() / int main(void) -> main函数不需要命令传递参数
int main(int argc,char *argv[]) -> main函数可以进行命令行传参
argc -> argument count 参数个数
argv -> argument value 参数的值
./a.out -> argc = 1 argv[0] = "./a.out"
./a.out aaa -> argc = 2 argv[0] ="./a.out" argv[1] = "aaa"
./a.out aaa bbb -> argc = 3 argv[0] = "./a.out" argv[1] = "aaa" argv[2] = "bbb"
./a.out aaabbb -> argc = 2 argv[0] = "./a.out" argv[1] = "aaabbb"
2)printf()如何输出命令行参数内容?
%d -> 以十进制形式输出内容
%s -> 输出字符串
3)命令行传递参数有什么作用?
使用命令行传递参数,argv数组中值就可以每一个执行结果都不一样,并不需要每一个修改都要重新编译。
练习4:无论输入多少个参数,程序都可以将所有的参数都打印出来!
./a.out
./a.out aaa
./a.out aaa bbb
#include <stdio.h>
// argv[0] argv[1] argv[2] argv[3]
int main(int argc,char *argv[]) // ./a.out aaa bbb ccc
{
int i;
for(i=0;i<argc;i++)
{
printf("argv[%d] = %s ",i,argv[i]);
}
return 0;
}
6、注释 -> 对代码进行解析,需要添加对应的注释。
单行注释: //注释内容
多行注释: /*注释内容*/
7、缩进与空行
当有复合语句{}时,需要将复合语句中所有表达式进行缩进。
代码中每一个模块使用空行进行分隔,复合语句{}需要独立出来一行。
8、编译程序
编译器: gcc
用法: gcc + [需要编译文件的路径]
1)为什么需要进行编译?
因为C语言属于高级语法,机器只能看懂二进制程序,所以需要将C语言编译为二进制文件,才能在机器上运行。
2)如何编译?
如果不指定新的二进制文件名字是什么,那么编译器默认在当前目录下生成一个a.out二进制文件。
编译命令: gcc test.c -> 默认在当前目录下生成a.out二进制文件。
gcc test.c -o test -> 默认在当前目录下生成test二进制文件。
3)执行二进制程序
执行命令: ./a.out
执行命令: ./test
a.out与test除了名字不一样,其他都一样!
五、基本数据类型与变量
1、 linux C语言中基本数据类型有哪些?
char、short、int、long、float、double。
2、 这些数据类型在内存中占用多少个字节?
使用sizeof()进行计算。
char、short、int、long、float、double。
1 2 4 4 4 8 -> 基本数据类型占用空间大小由C语言编译系统决定!
3、 如何定义变量?
公式: 数据类型 + 变量名
数据类型? -> 从基本数据类型中选择一个。
变量名定义规则?
1)只能由数字、字母,下划线组成。
2)不能以数字开头。
3)不可以与系统的关键字重名。
例子: 定义一个整型变量?
int a; -> 在内存空间连续申请4个字节,使用变量a间接访问这片内存空间。
4、 程序运行时,会占用内存空间?
=========test.c=========
int main()
{
int a;
return 0;
}
========================
./test -> 将你的程序加载内存中
int a; -> 在内存空间连续申请4个字节,使用变量a间接访问这片内存空间。
return 0; -> 释放空间
5、内存如何分配空间? -> 原则: 连续空闲不确定
1)分配空间时,内存一定是连续的。
2)分配的空间,一定是空闲的(之前没有变量申请过的)
3)分配空间时,位置是不确定的。
六、运算符号
+ - * / % == != | || & &&
+ - *
/ -> 结果看两边符号
5/3 = 1
5.0/3 = 1.666667
5/3.0 = 1.666667
5.0/3.0 = 1.666667
% -> 取余,两边不能出现小数点
5.0%3
5%3.0
5.0%3.0
5%3 -> 正确
== 判断等于
!= 判断不等于
| -> 位或运算
|| -> 逻辑或运算
& -> 位与运算
&& -> 逻辑与运算
5&6 = 0101 & 0110 = 4
5&&6 = 1 (非0即真)
5|6 = 0101 | 0110 = 7
5||0 = 1 (非0即真)