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即真)