程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言入門知識 >> C語言基礎知識匯總

C語言基礎知識匯總

編輯:C語言入門知識

- Hello,C

//類似於java import  引入頭文件 
int main() {
    printf("Hello,C\n");//輸入語句
//  system("pause");//暫停   讓cmd窗口不消失
return 0;
}
" data-snippet-id="ext.5bb8d5606ae4a3f75e42babc2b126c74" data-snippet-saved="false" data-codota-status="done">#include//類似於java import  引入頭文件 
int main() {
    printf("Hello,C\n");//輸入語句
//  system("pause");//暫停   讓cmd窗口不消失
return 0;
}

第一個沒啥好講的,include類似JAVA的import導包操作,以前學習C的之後一直寫#include< stdio.h>老師也沒說,不知道是個啥!現在才恍然明白原來是standard i/o的意思.默認是有一個返回值的(void也是可以的,但是C++好像就強制要求要返回值),一般return 0;作為程序的正常結束。

- c的基本數據類型和變量的定義

int main(){
    //基本數據類型 字符型 char| 整型  short  int long | 浮點型 float  double |有符號 signed |無符號 unsigned|void 空       
    char c = 'a'; 
    short a = 10; 
    int i = 10; 
    long q = 10;
    float x = 10;
    double y = 10;
    printf(" i = %d \n",i);
    }
" data-snippet-id="ext.ee2a10fe64308b41bbcc87f7e41ff8fb" data-snippet-saved="false" data-codota-status="done">#include
int main(){
    //基本數據類型 字符型 char| 整型  short  int long | 浮點型 float  double |有符號 signed |無符號 unsigned|void 空       
    char c = 'a'; 
    short a = 10; 
    int i = 10; 
    long q = 10;
    float x = 10;
    double y = 10;
    printf(" i = %d \n",i);
    }

在C中變量需要先定義後使用,不能像java一樣,在哪裡需要就直接 int i=0;在C中是行不通的.
常用數據類型長度在32 位的系統上
short 出來的內存大小是2 個byte;
int 出來的內存大小是4 個byte;
long 出來的內存大小是4 個byte;
float 出來的內存大小是4 個byte;
double 出來的內存大小是8 個byte;
char 出來的內存大小是1 個byte。
(具體長度和平台有關,可以用sizeof 方法測試一下)
輸出時不同輸出格式都有那些呢?
(1)d(或i)格式符。用來輸出十進制整數,有以下幾種用法:
??①%d,按整型數據的實際長度輸出。
??②%md,m為指定的輸出字段的寬度。如果數據的位數小於m,
?? 則左端補以空格,若大於m,則按實際位數輸出。
?? ③%ld(%mld 也可),輸出長整型數據。
??例如:long a=123456;
?? printf(“%ld”,a);
(2)o格式符,以八進制數形式輸出整數。格式:%o,%mo,%lo,%mlo都可。
(3)x(或X)格式符,以十六進制數形式輸出整數。格式:%x,%mx,%lx,%mlx都可。
(4)u格式符,用來輸出unsigned型數據,即無符號數,以十進制數形式輸出。
格式:%u,%mu,%lu都可。
(5)c格式符,用來輸出一個字符。格式:%c,%mc都可。
(6)s格式符,用來輸出一個字符串。格式:%s,%ms,%-ms,%m.ns,%-m.ns都可。
(7)f格式符,用來輸出實數(包括單、雙精度),以小數形式輸出。格式:%f,%m.nf,%-m.nf都可。
注意:單精度實數的有效位數一般為7位,雙精度為16位。
(8)e(或E)格式符,以指數形式輸出實數。格式:%e,%m.ne,%-m.ne都可。
(9)g(或G)格式符,用來輸出實數,它根據數值的大小,自動選f格式或e格式(選擇輸出時占寬度較小的一種)。

- 循環語句for

int main() {
    //c99標准
    int i;
    for(i = 0; i<100; i++) {
        printf(" i = %d\n",i);
    }

    system("pause");//暫停   讓cmd窗口不消失
}" data-snippet-id="ext.29dffee7d9765d50adbdad7086c1deff" data-snippet-saved="false" data-codota-status="done">#include
int main() {
    //c99標准
    int i;
    for(i = 0; i<100; i++) {
        printf(" i = %d\n",i);
    }

    system("pause");//暫停   讓cmd窗口不消失
}

這個java的區別就在於,java可以在任何需要的地方直接創建個變量,for一般寫成

    for(int i = 0; i<100; i++) {
    }

C則需要先聲明變量.下面是常見的語句
這裡寫圖片描述

- 指針變量

int main() {

    int* p;//定義一個int*類型的指針變量 p

    int i = 10;//定義一個int類型的變量 i  i就有一個內存地址值

    //指針賦值  &就是取內存地址,將i的地址賦值給p
    p = &i;

    printf("i = %d\n",i);//直接獲取i的值   *:獲取指針變量指向的值

    printf("通過指針對象去獲取 i = %d \n",*p);

    printf("指針變量p  = %d \n",p);

    //重點:  特殊: * &
    //1 怎麼定義指針變量    類型*   變量名;
    //2 怎麼賦值        p = &i;
    //3 怎麼拿值        int i = *p;

    system("pause");//暫停   讓cmd窗口不消失
}" data-snippet-id="ext.40001aaa81076738ded619164af5d58b" data-snippet-saved="false" data-codota-status="done">#include
int main() {

    int* p;//定義一個int*類型的指針變量 p

    int i = 10;//定義一個int類型的變量 i  i就有一個內存地址值

    //指針賦值  &就是取內存地址,將i的地址賦值給p
    p = &i;

    printf("i = %d\n",i);//直接獲取i的值   *:獲取指針變量指向的值

    printf("通過指針對象去獲取 i = %d \n",*p);

    printf("指針變量p  = %d \n",p);

    //重點:  特殊: * &
    //1 怎麼定義指針變量    類型*   變量名;
    //2 怎麼賦值        p = &i;
    //3 怎麼拿值        int i = *p;

    system("pause");//暫停   讓cmd窗口不消失
}

指針原理圖:
這裡寫圖片描述

Note:需要注意的是,指針*p在左與在右的區別:
int i = 0;
int *p = &i;
int j = *p; // *p出現在右邊,表示p指向的int型變量的值
*p = 2; // *p出現在左邊,表示p指向int型變量的內存空間

- 多級指針

//類似於java import  引入頭文件 
int main() {

    //typedef int** pi;//聲明新的數據類型,代替了int** 數據類型,類似取別名
    //定義多級指針
    int i = 10;
    int* p = &i;
    int** q = &p;
    int*** r = &q;

    //通過r獲取i的值
    printf("i = %d \n",***r);

    //通過q獲取i的值
    printf("i = %d \n",**q);

    //通過p獲取i的值
    printf("i = %d \n",*p);

    //規律:看前面的*號  數量  ,取值的時候,有多少個*,取值的時候就用多少個*號

    system("pause");//暫停   讓cmd窗口不消失

}" data-snippet-id="ext.c5a6bac3333814ce10e96ddad84384c2" data-snippet-saved="false" data-codota-status="done">#include//類似於java import  引入頭文件 
int main() {

    //typedef int** pi;//聲明新的數據類型,代替了int** 數據類型,類似取別名
    //定義多級指針
    int i = 10;
    int* p = &i;
    int** q = &p;
    int*** r = &q;

    //通過r獲取i的值
    printf("i = %d \n",***r);

    //通過q獲取i的值
    printf("i = %d \n",**q);

    //通過p獲取i的值
    printf("i = %d \n",*p);

    //規律:看前面的*號  數量  ,取值的時候,有多少個*,取值的時候就用多少個*號

    system("pause");//暫停   讓cmd窗口不消失

}

多級指針在使用的時候並沒有和一級指針有太多的區別,其實就是二級指針就是指向一級指針地址的指針,三級指針就是指向二級指針地址的指針,類推

- 數組

數組簡單來說就是存放指定數據類型的一種數據結構.
他是一種指針類型的變量.直接使用指針變量arr,默認是指向數組的首地址
下面是一個int型的數組的賦值與取值操作:

//類似於java import  引入頭文件 
int main() {

    //定義數組
    int arr[10];
    int i;
    //循環賦值
    for(i = 0; i<10; i++) {
        arr[i] = i;
    }
    //循環輸出 倒著輸出
    for(i=9; i>=0; i--) {
        printf("arr[%d] = %d \n",i,arr[i]);
    }

    system("pause");//暫停   讓cmd窗口不消失
}" data-snippet-id="ext.12e8ab2bd279bd8cc10170c9ee323773" data-snippet-saved="false" data-codota-status="done">#include//類似於java import  引入頭文件 
int main() {

    //定義數組
    int arr[10];
    int i;
    //循環賦值
    for(i = 0; i<10; i++) {
        arr[i] = i;
    }
    //循環輸出 倒著輸出
    for(i=9; i>=0; i--) {
        printf("arr[%d] = %d \n",i,arr[i]);
    }

    system("pause");//暫停   讓cmd窗口不消失
}

這裡寫圖片描述
因為數組是一個指針類型的變量,默認指向首地址,我們可以通過指針變量指向地址的偏移來取數組指定位置的值,需要注意的是不同數據類型的偏移量,如:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;"> int arr[] = {1,5,8}; int i; for(i = 0; i<3; i++) { printf("arr[%d] = %d \n",i,*(arr+i));//指針變量偏移再取值 }

- 結構體

學了java回頭看C語言的結構體(或者說是結構),就感覺特別親切,因為他和類特別像,大概結構體的設計就有面向對象編程的思想在裡面

//定義結構體 
struct person {
    int age;
};
int main() {

    struct person p;//定義一個結構變量
    //給結構體裡面的屬性賦值
    p.age = 18;

    printf("p.age = %d \n",p.age);

    system("pause");//暫停   讓cmd窗口不消失
}" data-snippet-id="ext.d6066db64ae382fbe620055ea0d719af" data-snippet-saved="false" data-codota-status="done">#include
//定義結構體 
struct person {
    int age;
};
int main() {

    struct person p;//定義一個結構變量
    //給結構體裡面的屬性賦值
    p.age = 18;

    printf("p.age = %d \n",p.age);

    system("pause");//暫停   讓cmd窗口不消失
}

需要注意的是定義結構體的關鍵字struct,還有就是結構體應該在開始的時候聲明,結構體名的書寫C裡面一般都是小寫,而不是像java一樣類名開頭要大寫,當然這是編寫習慣,大寫也不會提示錯誤

- 結構體指針變量

//類似於java import  引入頭文件 
//定義結構
struct person {
    int age;
} *p; //定義了一個結構體指針變量
int main() {
    //動態申請內存
    p = (struct person*)malloc(sizeof(struct person));
    /*
    //賦值
    (*p).age = 21;//James
    //輸出
    printf("p.age = %d\n",(*p).age);
    */

    p->age = 2;
    printf("p->age = %d \n",p->age);

    system("pause");//暫停   讓cmd窗口不消失
}" data-snippet-id="ext.4737c61d1d7144fde6600b5c55841ee5" data-snippet-saved="false" data-codota-status="done">#include//類似於java import  引入頭文件 
//定義結構
struct person {
    int age;
} *p; //定義了一個結構體指針變量
int main() {
    //動態申請內存
    p = (struct person*)malloc(sizeof(struct person));
    /*
    //賦值
    (*p).age = 21;//James
    //輸出
    printf("p.age = %d\n",(*p).age);
    */

    p->age = 2;
    printf("p->age = %d \n",p->age);

    system("pause");//暫停   讓cmd窗口不消失
}

需要注意的是*p一開始並沒分配內存,就類似java的一個變量,只是聲明了並沒有做new的操作,所以我們要new一下,調用C的分配內存的方法給p分配一個person數據類型大小的內存,並把p強轉為person類型

p = (struct person*)malloc(sizeof(struct person));

在上面我們看到兩種給結構體變量賦值的方式,這並沒有好壞自分,看個人習慣

方式一:
(*p).age = 21;//James 

*p表示數據類型person,這類似java裡面 類名.數據類型

方式二:
 p->age = 2;//James

p表示指針,p->則指向這個數據類型age的地址

- 函數

//聲明一個函數
int add(int x,int y);
int main() {

    int x = 1,y = 1;
    //使用函數
    int z = add(x,y);
    printf(" x + y = %d\n",z);

    system("pause");//暫停   讓cmd窗口不消失
}
//實現函數
add(int x,int y) {
    return x + y;
}" data-snippet-id="ext.803a7d9dff5358b0e7d8a459a77be2f2" data-snippet-saved="false" data-codota-status="done">#include
//聲明一個函數
int add(int x,int y);
int main() {

    int x = 1,y = 1;
    //使用函數
    int z = add(x,y);
    printf(" x + y = %d\n",z);

    system("pause");//暫停   讓cmd窗口不消失
}
//實現函數
add(int x,int y) {
    return x + y;
}

在C裡面函數需要在開始的時候先聲明,當然你在生命的時候實現也是可以的,但是並不推薦這樣做

//聲明並實現一個函數,不推薦
int add(int x,int y) {
    return x + y;
}
int main() {

    int x = 1,y = 1;
    //使用函數
    int z = add(x,y);
    printf(" x + y = %d\n",z);

    system("pause");//暫停   讓cmd窗口不消失
}" data-snippet-id="ext.8f8fada690b48a9c13afd0279bc0899c" data-snippet-saved="false" data-codota-status="done">#include
//聲明並實現一個函數,不推薦
int add(int x,int y) {
    return x + y;
}
int main() {

    int x = 1,y = 1;
    //使用函數
    int z = add(x,y);
    printf(" x + y = %d\n",z);

    system("pause");//暫停   讓cmd窗口不消失
}

NOTE:函數裡面的變量x,y是局部變量和mian裡面的x,y是全局變量,當局部變量和全局變量重名時候,在局部變量作用域作用的是局部變量而不是全局變量

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved