別混淆了sizeof(數組名)和sizeof(指針)

本文著作權聲明:請務必閱讀個人介紹部分!

我們在挨個兒輸出一個數組中的元素時,最常用的就是用一個for循環來實現,簡單了事。比如類似下面的代碼片段:

for(i = 0; i< length; i++)

{

printf(“數組元素是%d”, 數組[i]);

}

用一個下標索引變量i來遍歷整個數組,length是數組的長度。當然了,length得提前計算出來,計算的方式有很多,很多朋友會想到用sizeof計算。不過,sizeof好歸好,但是也要睜大你的雙眼,小心用錯,你若不信,請繼續往下看。

先看傳統的做法,代碼如下:

#include "stdio.h"

int main(void) 
{
    int number[5] = {1,2,3,4,5};
    int index = 0;

    printf("數組的元素分別是:\n");
    for(index = 0;index < 5; index++)
    {
        printf("%d ", number[index]);
    }
    printf("\n");
    
    return 0;
}

最簡單的方法就是寫死了數組長度,再用一個循環挨個兒輸出。程序清晰易懂,結果是:


image.png

結果也是清晰易懂。
有的朋友會突發奇想,為何不這樣來做:

#include "stdio.h"

int main(void) 
{
    int number[5] = {1,2,3,4,5};
    int index = 0;
    int *p = &number[0];

    printf("數組的長度是: %d\n", sizeof(p));

    printf("數組的元素分別是:\n");
    for(index = 0;index < sizeof(p); index++)
    {
        printf("%d ", number[index]);
    }
    printf("\n");
    
    return 0;
}

增加了一個指針變量p,指針變量p的初始值是數組首元素的地址。有的朋友企圖用sizeof(p)來獲取數組長度,這是不對的,請看結果:


image.png

從結果可以看到,sizeof(p)其實計算的是指針變量p的大小。在32位系統上,不管指針p指向的是整型數據,還是字符型數據,short型數據,long型數據等,指針p本身所占的內存字節數均為4。也就是要使用4個字節的大小來存儲變量p的值。

我還見過有朋友這樣用sizeof的,代碼如下:

#include "stdio.h"

void print(int number[5]) 
{ 
    int index = 0; ; 

    printf("函數print中,數組長度是: %d ", sizeof(number));

    printf("函數中數組的元素分別是:\n");
    for(index = 0; index < sizeof(number) / sizeof(number[0]); index++)
    {
        printf("%d ", number[index]);
    } 
    printf("\n");
} 

int main(void) 
{
    int number[5] = {1,2,3,4,5};

    print(number);
    
    return 0;
}

這次代碼又修改了一下,將數組名number傳給函數print,并且print函數的形參看上去像是一個數組。運行結果是


image.png

諾諾,運行結果不是預期中的結果啊。其實,函數print形參看上去像是一個數組,于是有的朋友就會認為它就是一個數組,于是就發生了使用sizeof來計算數組長度;真實情況是print函數的參數還是一個指針,指針,指針,沒錯,就是一個指針,所以sizeof(number)計算的還是指針的大小。初學的朋友們一定要切記!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 指針是C語言中廣泛使用的一種數據類型。 運用指針編程是C語言最主要的風格之一。利用指針變量可以表示各種數據結構; ...
    朱森閱讀 3,470評論 3 44
  • 變量的聲明和定義變量聲明(declaration) 可以declaration很多次,不占內存空間,例如 exte...
    FlyingReganMian閱讀 1,054評論 0 1
  • 啟動兩個容器,分別為node0,node1,系統是ubuntu16.04建立一個新的網段docker networ...
    深度學習dlai閱讀 279評論 0 0
  • 2018-11-13 哈爾濱第380期利他二組簡書作者 姓名:周翔 揚州市方圓建筑工程有限公司 【日精進打卡第19...
    香蕉香蕉_2917閱讀 88評論 0 0
  • 君召使擯,色勃如也,足躩如也。揖所與立,左右手,衣前后,襜如也。趨進,翼如也。賓退,必復命曰:“賓不顧矣。” 大意...
    像話讀書爻閱讀 131評論 0 1