1、linux基本命令linux
ls/cd/pwd ->没有修改系统资源,只是浏览linux系统,因此在任何的路径下均可以使用,没有受到权限限制。ubuntu
一、 建立普通文件? -> touchwindows
用法: touch + [新文件的路径] + ... -> 既能够是绝对,又能够是相对。数组
例子1: 假设当前在家目录,想在家目录下建立一个新的文件,名字叫test.c。框架
相对: touch ./test.c 等价于 touch test.c函数
绝对: touch /home/gec/test.c工具
例子2: 假设当前在/home目录,想在根目录下建立一个新的文件,名字叫example.txt。ui
相对: touch ../example.txtspa
绝对: 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$
二、 删除普通文件? -> rm命令
用法: rm + [须要删除的文件的路径]
假设当前在家目录
练习1: 删除家目录下test.c
rm ./test.c
练习2: 删除根目录下example.txt和test.txt
sudo rm ../../example.txt ../../test.txt -> 能够跟多个文件的路径。
2、编辑C语言程序的工具。
一、 在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!\n");
return 0;
}
======================================================================================
二、 在linux系统下编辑? --- 使用gedit编辑工具。
1)使用gedit指定一个文件的名字。
2)直接编辑,按退出便可!
三、 在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)能不能在共享目录中建立?
答案:能,用户随意建立。
3、分析linux C语言大纲
一、main函数使用事项、基本数据类型、变量定义/赋值、生命周期做用域、运算符,程序编译过程分析。
二、ASCII码,语句/表达式,逗号表达式/三目运算,控制流循环与分支结构。
三、函数定义、调用、声明、函数形式参数与实参之间关系,函数返回值,函数书写规则,函数运行规则。
四、一些特殊函数调用:递归函数、回调函数、变参函数,内联函数
五、数组定义/赋值,数组元素,一维数组、二维数组、整型数组、字符数组,指针数组。
六、指针定义/赋值,指针的数据类型,整型指针,字符指针,数组指针,函数指针,二级指针。
七、结构体定义,结构体变量、结构体指针、结构体变量与指针如何访问结构体的成员,如何计算结构体的空间。
八、联合体、枚举类型、typedef、宏定义、头文件、条件编译、拆分多个.c文件
九、如何申请堆空间?如何释放?
十、字符串函数,计算字符串长度,拷贝字符串到另外一块内存空间,追加字符串,比较两个字符串。
4、linux C语言基本框架。
C语言程序入口: main函数 -> main() -> 每个程序都必须有main函数。
一、main函数有什么特色?
1)程序必须以main做为主函数命名。
2)程序不是从第一个函数开始执行,而是从main函数开始。
3)main函数在程序中有且仅有一个。
二、main函数基本框架?
main() -> 函数头
{ -> 函数体
}
三、linux函数属于一个任务,每个任务都会一个返回值,返回值就会返回给调用函数的地方。
返回值类型写在函数头前面。
返回值类型 main()
{
...;
...;
return 返回值结果;
}
注意事项:
1)返回值类型能够是基本数据类型,也能够是自定义数据类型。
2)main执行return表明程序的退出,子函数执行了return表明子函数返回,返回到调用的地方。
3)返回值结果必须与返回值类型匹配。
例子:
int fun()
{
...;
return 1; -> 返回到main函数中
}
int main()
{
fun();
return 0; -> 表明程序结果
}
四、头文件
1)程序中必定要添加头文件吗?
不是。若是程序没有调用到任何的函数,则不须要添加头文件,只有当程序调用了函数,才须要添加对应的头文件。
例子:如下例子不须要添加头文件
int main()
{
return 0;
}
2)头文件有什么做用?
对函数进行声明,函数在调用前必须声明,不然就会编译警告!
3)函数对应的头文件是什么?
例子: printf() -> 在Ubuntu终端输入: man 3 printf(按'q'退出) -> 获得对应的头文件: #include <stdio.h>
例子:
#include <stdio.h>
int main()
{
printf("helloworld!\n");
return 0;
}
4)头文件不加会有什么问题?
warning: incompatible implicit declaration of built-in function ‘xxxxx’ -> xxxxx这个函数的头文件没有添加!
五、 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\n",i,argv[i]);
}
return 0;
}
六、注释 -> 对代码进行解析,须要添加对应的注释。
单行注释: //注释内容
多行注释: /*注释内容*/
七、缩进与空行
当有复合语句{}时,须要将复合语句中全部表达式进行缩进。
代码中每个模块使用空行进行分隔,复合语句{}须要独立出来一行。
八、编译程序
编译器: 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除了名字不同,其余都同样!
5、基本数据类型与变量
一、 linux C语言中基本数据类型有哪些?
char、short、int、long、float、double。
二、 这些数据类型在内存中占用多少个字节?
使用sizeof()进行计算。
char、short、int、long、float、double。
1 2 4 4 4 8 -> 基本数据类型占用空间大小由C语言编译系统决定!
三、 如何定义变量?
公式: 数据类型 + 变量名
数据类型? -> 从基本数据类型中选择一个。
变量名定义规则?
1)只能由数字、字母,下划线组成。
2)不能以数字开头。
3)不能够与系统的关键字重名。
例子: 定义一个整型变量?
int a; -> 在内存空间连续申请4个字节,使用变量a间接访问这片内存空间。
四、 程序运行时,会占用内存空间?
=========test.c=========
int main()
{
int a;
return 0;
}
========================
./test -> 将你的程序加载内存中
int a; -> 在内存空间连续申请4个字节,使用变量a间接访问这片内存空间。
return 0; -> 释放空间
五、内存如何分配空间? -> 原则: 连续空闲不肯定
1)分配空间时,内存必定是连续的。
2)分配的空间,必定是空闲的(以前没有变量申请过的)
3)分配空间时,位置是不肯定的。
6、运算符号
+ - * / % == != | || & &&
+ - *
/ -> 结果看两边符号
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即真)