本文著作權聲明:請務必閱讀個人介紹部分!
我們在挨個兒輸出一個數組中的元素時,最常用的就是用一個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)計算的還是指針的大小。初學的朋友們一定要切記!