1. 程式人生 > >淺談入門C語言需要知道的要點

淺談入門C語言需要知道的要點

前言,用VS編C需要用的一些宣告:
#define _CRT_SECURE_NO_DEPRECATE(這樣就可以使用scanf)
scanf讀資料的時候不要加\n!這樣會導致編譯器需要你輸入字元才會讀取下一行程式碼,因為本身你要按回車才會進行讀操作!這也是新手一般會犯的錯誤(博主是看浙大翁凱老師的視訊學的,老師講的很好!水平確實高哈,值得推薦)
指標
1.定義:是用來儲存地址的變數
2.指標的值即地址
3.*是一個單目運算子,用來訪問指標的值所表示地址上的變數
4.常見錯誤,定義了一個指標,還沒指向其他變數就開始賦值(這是不行的,因為沒有指向其他變數的指標,初始是指向一個不知道的地方,也許現在不會錯,但是以後用到那個地方的時候,就可能會報錯)

應用場景
1.函式返回多個值,某些值就只能通過指標返回
2.函式返回運算的狀態,結果通過指標返回(例如除法運算)
指標與陣列
1.陣列變數是特殊的指標
陣列變數本身是地址變數,例 int a[10]; int *p = a;//不用&取地址,a是地址變數
陣列的單元表達的是變數,需用&取地址,例 int *p; p = &a[0];//a[0]是int型級 a == &a[0]
2.函式引數表中的陣列實際上是指標,例如

2.陣列其實是一個常量指標(const),即不能進行賦值改變
3.指標與const,例
int i;
const int p1 = &i;
int const p2 = &i;
int const p3 = &i;
判斷哪個被const了的標誌是const在

的前面還是後面
4.也可以用
(p + i)遍歷陣列,例如(因為
p==number[0])
int number[] = {1, 2, 3, 4, 5};
int p = number;
int i;
for (i = 0; i <= 5; ++i) {
printf("%d\n", (p + i));
}
動態記憶體分配
1.malloc函式
2.引入標頭檔案#include<stdlib.h>
3.Void
malloc(size_t size)
4.向malloc申請空間的大小是以位元組為單位的
5.返回的結果是void
,需要型別轉化為自己需要的型別
6.(int )malloc(n
sizeof(int))注:一定要記得寫malloc
7.劃重點,如果用了malloc函式 一定要用free
字串
1.C語言中並沒有專門表達字串的關鍵字
2.C語言中字串用char arr[] = “”; || char *arr = “”;
3.字串在C語言編譯中,表示 例
char *arr = “Helloworld”;
char arr[] = {“H”, “l”, “l”, “o”, “w”, “o”, “r”, “l”, “d”, “/0”};
4.常用表示方法char *arr = “Helloworld”;
5.重點:char *arr = “Helloworld”; 指的是arr這個指標初始化指向一個字串常量,但是實際上這個常量是const型的即const char *arr = “Helloworld”;即這個字串只能進行讀操作!
6.要對定義的字串進行修改就只能用這種定義方式即:char arr[] = “Helloworld”,與前面一種定義方式不同的是,arr[]是我定義一個字串是它,*arr是我指向一個字串是它
7.判斷是用指標還是陣列定義字串

字串輸入輸出
也可以用scanf讀取字串,但是隻能讀取一個單詞(單詞個數根據空格或回車分別),還有就是scanf有個缺點就是它是沒有邊界的,使用再讀字串的時候要給%s加讀取的個數如%7s即讀取7個字元(最多)
空字串:char buffer[100] = “”;
char buffer[] = “”;//這種形式buffer的長度只是為1,只能賦值一個
8.二維陣列,第二維必須宣告大小即
char a[][10];//這樣編譯才能通過。但是這種方式定義的二維陣列,他的a[0]的長度必須為10不能超過10!
char *a[];//這樣編譯,它的a[0]就是char *就是一個指標,對字串長度沒有限制
單字元輸入輸出
1.putchar 和getchar 方法返回型別都是int型別,getchar()傳入的引數型別也是int,即會返回一個C語言自己定義的巨集EOF,EOF = -1。執行程式時輸入Ctrl + Z會讓程式返回EOF即-1
字串函式
1.首先要引入標頭檔案string.h
2.strlen(socnt char *a)函式
3.strcmp(const char *s1, const char *s2)字串比較函式
返回結果:0: s1 = s2
1: s1 > s2
-1: s1 < s2
注:用==比較兩個字串的時候是指這兩個字串是否是相同的地址
4.break關鍵字用於跳出當前迴圈,對於巢狀的迴圈或switch語句,break直接退出直接包裹它的那一重迴圈
5.Strcopy,使用如:

即要先定義一個字串,然後為它分配儲存儲存空間,儲存空間大小可以通過strlen求需要複製的物件,但是要加上最後’/0’即加一!
6.srtca(s1, s2),將s2接到s1後面,所以要求s2要有足夠的空間
在這裡插入圖片描述
列舉
1.列舉是一種使用者定義的資料型別,它以關鍵字enum以如下語法來宣告:
enum{名字0, 名字1…名字n};
enum中的值是自動遞增的0 1 2 3 4…
2.宣告列舉量的時候可以指定值,如:
enum{a = 1, b = 10, c};//此時c是10+1
3.列舉是int型別,一般很少用,只有一些變數排列的定義的時候,可以這樣定義
結構
結構體內的變數叫成員變數
1.宣告結構的三種形式:
在這裡插入圖片描述
2.結構體初始化:
在這裡插入圖片描述
結構與函式
1.想通過方法對結構體的值進行操作,想直接通過傳入結構體的名字是不行的,也是要強調的再c語言中函式呼叫是隻傳值的
在函式中,只是對結構體的值進行操作,但是退出函式,結構體的值並沒有變化,如:
在這裡插入圖片描述
那麼如何解決這中情況,當然用結構指標是絕對可以的,下面講一種不用指標的方法,即通過在方法中定義一個結構體,如何讓這個方法返回結構體,再賦值給需要改變main方法中的結構體變數,例如
在這裡插入圖片描述
2.所以呼叫方法,推薦用指標,即指向結構的指標,例如
在這裡插入圖片描述
現在用指標重做上面的方法,如
在這裡插入圖片描述
注:記住一句話,傳結構不如傳指標!
結構中的結構
1.結構陣列,例如:struct date dates[100]
struct date dates[] = {{4, 5, 2005}, {2, 4, 20055}};
在這裡插入圖片描述
注:其中%.2i的意思是按兩位數輸出,即如果輸出的數只有各位,那麼向上補0
2.結構中的結構,例如:
在這裡插入圖片描述
3.結構中的結構的陣列
在這裡插入圖片描述
4.
自定義資料型別(typedef)
1.C語言提供了一個叫typedef的功能宣告一個已有的資料型別的新名字,如:
Typede int length;//這樣length可以代替int變量出現在變數定義和引數宣告的地方,即
Length a;//相當於int a
2.通過使用tyedef定義struct型別改善程式的可行性即:
在這裡插入圖片描述
聯合Union

全域性變數
1.全域性變數會自動初始化為0,區域性變數不會自動初始化,所以沒用初始化的全域性變數會得到:0值、指標會得到NULL(它的初始化發生在main函式前)
2.如果main函式中有和全域性變數名相同的變數,全域性變數會隱藏
靜態本地變數

  1. 在本地變數定義時加上static修飾符就成為靜態本地變數,靜態本地變數在離開函式時,會繼續存在並儲存其值,靜態本地變數的初始化只會在第一次進入這個函式時做,以後進入函式時會保持上次離開時的值,如:
    在這裡插入圖片描述
    2.靜態本地變數其實相當於全域性變數
    3.靜態本地變數與本地變數的區別:靜態本地變數本地作用域、全域性生存期;本地變數區域性作用域、區域性生存期。
    注:需要注意的是不要使用全域性變數來在函式間傳遞引數和結果,儘量避免使用全域性變數,要通過函式對值進行操作,儘量使用指標!
    編譯預處理指令(巨集的定義)
    1.#l開頭的是編譯預處理指令,它們不是C語言的成分,但是C語言離不開它
    2.用#define定義巨集
    帶引數的巨集
    1.定義帶引數的巨集的原則,一切都需要有括號,整個值要括號,引數出現的每個地方都要有括號,帶引數的巨集的定義如下:
    #define RADTODEG(x) ((x) * 3.1415)//
    2.#開頭的語言。不能加分號!
    3.#include不是用來引入庫的,例如:#include<stdio.h>只是為了讓編譯器知道printf函式的原型,保證呼叫時給出的引數值時正確的。
    4.不對外公開的函式,在函式前面加上static就使得它成為只能在所在編譯單元中被使用的函式
    宣告
    1.在寫一些比較大型的程式的時候,需要把函式的定義和宣告還有main.c分別寫,定義寫在.c檔案中,定義寫在.h檔案中,這三種檔案需要引用.h檔案
    2.注:include檔案中,很可能會出現一個檔案被多次引用,這樣會導致多次定義變數,為了避免這種情況出現,需要用帶如下預編譯指令:
    #ifndef a
    #define a
    #endif
    即標準標頭檔案結構:
    在這裡插入圖片描述
    格式化輸入輸出
    1.printf
    %[flags][width][.prec][hIL]type
    在這裡插入圖片描述
    在這裡插入圖片描述
    在這裡插入圖片描述
    在這裡插入圖片描述
    %n的使用:printf(“%d%n”, 12345, &a);//此時a等於5,因為輸出的字元的長度為5

2.scanf
%[flag]type
在這裡插入圖片描述
檔案的輸入輸出
在這裡插入圖片描述
在這裡插入圖片描述
按位運算
1.C語言的按位運算:
按位的與:&
按位的或:|
按位取反:~
按位的異或:^
左移:>>
右移:<<
注:大多用於二進位制的運算
可變陣列(就只貼個宣告哈)
在這裡插入圖片描述