原文網址,本文並不是徹底翻譯,而是本身學習後的筆記ios
當我們要算array長度時,我們能夠使用sizeof,請參考如下代碼:spa
int size = sizeof(arr)/sizeof(arr[0]);
有沒有方法讓我們再不用sizeof的情況下找到陣列長度code
int arr[] = {1,2,3}; printf("array=%p : &array=%p\n", arr, &arr);
這段代碼,雖然印出的結果是相同的,可是其實arr和&arr是不一樣的概念:element
arr的原文解釋pointer to the first element of array
get
&arr原文解釋pointer to whole array of 3 int
it
int arr[] = {1,2,3}; printf("array+1 = %p : &array + 1 = %p", array+1, &array+1);
這段代碼,印出的結果可能會讓你有點驚訝,可是應用剛剛的觀念去想應該還能夠io
arr+1
則是第二個元素的位址,因此和arr
會相差4byte(假設sizeof(int)=4)stream
&arr+1
則是把整個陣列視為一個元素,則一個元素有4*3=12byte(假設sizeof(int)=4),&arr+1
則會和arr相差12byte方法
應用剛剛的觀念去定義一個macro,如下這個macro的好處是不用在意變數的型態poi
#include <iostream> using namespace std; // User defined sizeof macro # define my_sizeof(type) ((char *)(&type+1)-(char*)(&type)) int main() { int arr[] = {1, 2, 3, 4, 5, 6}; int size = my_sizeof(arr)/my_sizeof(arr[0]); cout << "Number of elements in arr[] is " << size; return 0; }
#include <iostream> using namespace std; int main() { int arr[] = {1, 2, 3, 4, 5, 6}; int size = *(&arr + 1) - arr; cout << "Number of elements in arr[] is " << size; return 0; }