91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言數據類型與sizeof關鍵字實例分析

發布時間:2022-04-14 15:26:29 來源:億速云 閱讀:145 作者:iii 欄目:開發技術

這篇文章主要介紹“C語言數據類型與sizeof關鍵字實例分析”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“C語言數據類型與sizeof關鍵字實例分析”文章能幫助大家解決問題。

一、前言

介紹C語言當中的數據類型,并由此引出C語言當中的另外一個重要的關鍵字sizeof .

二、數據類型

1、數據類型有哪些

C語言的數據類型包括基本類型(內置類型)、構造類型(自定義類型)、指針類型以及空類型

C語言數據類型與sizeof關鍵字實例分析

2、為什么要有數據類型

為什么要有內置類型

我們日常生活中會遇到各種各樣的場景,而不同的場景需要不同數據來表示,比如我們聚餐的人數、天氣的溫度、海拔的高度等事情通常用整數來描述,而像人的身高、廣播的頻率、商品的價格則通常用小數表示,又比如我們的車牌號、樓棟的命名、服裝的尺碼則需要要用字母來表示;C語言作為第一門高級程序設計語言,為了能準確描述我們生活中各種各樣的場景,就有了整形、浮點型、字符型這些內置類型。

為什么要有自定義類型

我們以自定義類型中的數組類型和結構體類型舉例:
數組類型:我們生活中會碰到許多相同類型的集合,比如一個學校學生的學號,每一個學生的學號都是整形,那么為了表示所有學生的學號,就勢必要定義幾千個整形,顯然,那樣太麻煩了,于是就產生了數組類型,一個數組里面的每個元素的類型都是相同的,我們在定義一個學校學生的學號時,只需要定義一個有幾千個元素大小的數組即可,而不必去慢慢定義一千個整形
結構體類型:我們生活中所要描述的對象常常是復雜數據類型的集合,拿人來說,一個人有姓名、性別、身高、體重、年齡等等,這些數據類型都是不同的,那么為了能夠系統的描述一個人的屬性,就產生了結構體類型,它把一個人不同類型的數據都集中到一個新的類型當中,使對象描述和使用更加方便。

3、如何看待數據類型

從前面的博客中我們知道,定義變量的本質是在內存中開辟一塊空間,用來存放數據,而今天我們知道不同的變量是需要定義為不同的類型的,把二者結合起來,我們就不難得出:類型決定的是變量開辟空間的大小。
這時有兩個疑問點,第一、為什么要根據類型來開辟空間,我們直接開辟一塊空間,將內存整體使用不好嗎?答案是:不好。

原因主要有兩點:

1、在任何時刻,你的電腦都不是只在運行你目前所使用的那個程序,還有其他許多的程序也在同時運行,如果把整塊都分配給了你目前運行的程序,其他程序就崩潰了。
2、即使把整塊內存都分配給你,你也不能保證在任何時刻都對該內存塊全部都用完,這樣就會導致內存的浪費。
第二、我們使用部分內存,使用多少由什么決定的?答案是:是由你的場景決定,你的計算場景,決定了你使用什么類型的變量進行計算。你所使用的類型,決定了你開辟多少字節的空間大小。這也是為什么C語言要有這么多的數據類型,就是為了滿足不同的計算場景。
最后,那么不同的數據類型到底在內存開辟多少空間呢?這就需要使用我們的關鍵字 – sizeof 來計算了。

三、sizeof – 計算不同類型變量開辟空間的大小

1、內置類型開辟的空間大小

`#include<stdio.h>
int main()
{
    printf("%d\n", sizeof(char));       //1
    printf("%d\n", sizeof(short));      //2
    printf("%d\n", sizeof(int));        //4
    printf("%d\n", sizeof(long));       //4
    printf("%d\n", sizeof(long long));  //8
    printf("%d\n", sizeof(float));      //4
    printf("%d\n", sizeof(double));     //8
}`

C語言數據類型與sizeof關鍵字實例分析

2、自定義類型開辟的空間大小

數組大小

#include<stdio.h>
int main()
{
    int arr1[10] = { 0 };       //40
    char arr2[10] = { 0 };      //10
    long int arr3[10] = { 0 };  //40
    long long arr4[10] = { 0 }; //80
    float arr5[10] = { 0 };     //40
    double arr6[10] = { 0 };    //80
    printf("%d\n", sizeof(arr1));
    printf("%d\n", sizeof(arr2));
    printf("%d\n", sizeof(arr3));
    printf("%d\n", sizeof(arr4));
    printf("%d\n", sizeof(arr5));
    printf("%d\n", sizeof(arr6));
    return 0;
}

C語言數據類型與sizeof關鍵字實例分析

從上面的結果我們很容易得出:數組的大小 = 數組元素的類型乘以元素個數

其他自定義類型的大小

#include<stdio.h>
struct Test1{
    int a;
    char b;
    float c;
    double d;
};
union Test2{
    int m;
    char n;
};
enum Test3 {
    monday,
    tuesday,
    wednesday,
    thursday,
    frifay
};
int main()
{
    struct Test1 test1 = { 0 };
    union Test2 test2 = { 0 };
    enum Test3 test3;
    printf("%d\n", sizeof(test1));   //24
    printf("%d\n", sizeof(test2));   //4
    printf("%d\n", sizeof(test3));   //4
}

C語言數據類型與sizeof關鍵字實例分析

想必上面的結果與一些小伙伴心中的結果有所不同,確實,結構體、聯合體、枚舉這些自定義類型的大小和數組大小的求法是不相同的,其具體的求法涉及內存對齊、大小端、內存分配等相關知識,這些知識比較復雜,我會放在自定義類型詳解模塊中為大家講解,現在大家不用去深究。

3、指針類型開辟的空間大小

C語言數據類型與sizeof關鍵字實例分析

C語言數據類型與sizeof關鍵字實例分析

大家可以看到,我們上面不管指針的類型是什么(整形、字符型、浮點型、數組型),指針的大小始終是四個字節或者八個字節(第一張圖X86表示32位平臺,結果為4,第二張圖X64表示64位平臺,結果為8),所以結論就是:指針在32位平臺下是4個字節,在64位平臺下是8個字節。(至于為什么是這樣,這涉及到內存編址、地址線等相關知識,這一部分我會放在指針那里來詳細講解,現在大家只需要記住這個結論即可)
注:第二張圖有警告是因為我的電腦是32位平臺的,強制轉成64位會發生大小不匹配的問題。

4、空類型開辟的空間大小

C語言數據類型與sizeof關鍵字實例分析

我們可以看到雖然這里編譯器報錯了,但它仍然打印出來了void的大小:0個字節
注:void類型的大小為0個字節,這僅僅是在visual studio這個編譯器下運行的結果,但是,這個結果在不同的編環境下跑出來可能不同,就比如在Linux環境下,void類型的大小就為1,(由于水平的限制,這里暫時不能為大家演示);而導致這兩者之間有差異的根本原因是不同編譯環境對C語言的支持程度不同。

四、對sizeof 的進一步理解

1、sizeof 為什么不是函數

C語言數據類型與sizeof關鍵字實例分析

C語言數據類型與sizeof關鍵字實例分析

從上面我們可以看到,我們可以用 sizeof(a) 和 sizeof(int) 求一個整形的大小,這種方式也是大家所熟悉的,但是我們發現直接用
sizeof a 也能求出a的大小,而不需要圓括號,所以說,sizeof 是關鍵字(操作符)但是不是函數,因為函數參數需要用 () 起來才能正常使用。
注:sizeof int 報錯是因為 sizeof 和 int 都是關鍵字,而不能用一個關鍵字去求另一個關鍵字的大小

2、sizeof 的其他使用

C語言數據類型與sizeof關鍵字實例分析

這里我們定義了一個整型變量 a 和 指針變量 p ,以及數組 arr,可以看到 a 的大小為 4,arr 的大小為40,這些我們都理解,
那么剩下的sizeof &sect; 、sizeof(&arr) 、sizeof(arr) / sizeof(arr[0]) 是什么意思呢?下面為大家解釋(涉及指針相關知識)

p 是一個指針變量,里面存放的是 a 的地址,arr數組名表示arr數組首元素的地址(記憶),&arr 表示取出整個數組的地址,相當于一個數組指針,所以sizeof&sect; 和 sizeof(&arr) 都是求的指針的大小,而在上面我們知道,指針在32位平臺下是4個字節,所以這里結果為4。
最后,sizeof(arr) 求整個數組的大小,sizeof(arr[0]) 求第一個元素的大小,所以二者相除得到的是數組的元素個數10。
注:這里用sizeof(arr[0]) 來求一個數組元素的大小,而不是用arr[1] 、arr[2] 是因為我們不知道數組有幾個元素,所以可能arr[1] 、arr[2] 根本不存在,但是只要定義了數組,那么arr[0] 就是一定是存在的,也就是說,這樣做是為了安全。

關于“C語言數據類型與sizeof關鍵字實例分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

岳普湖县| 婺源县| 广宗县| 雅江县| 石阡县| 吐鲁番市| 都安| 丹寨县| 远安县| 西林县| 尼木县| 大荔县| 十堰市| 通许县| 木里| 普洱| 丽水市| 凤冈县| 青海省| 定兴县| 霸州市| 万宁市| 咸宁市| 璧山县| 乌拉特后旗| 克拉玛依市| 金门县| 湄潭县| 台北县| 朝阳县| 阳西县| 修武县| 临猗县| 行唐县| 鹤峰县| 东乌| 宁乡县| 宁远县| 宁城县| 汕尾市| 正定县|