原文網址,本文並不是完全翻譯,而是自己學習後的筆記
Introduction
當我們要算array長度時,我們可以使用sizeof,請參考以下代碼:
int size = sizeof(arr)/sizeof(arr[0]);
Problem
有沒有方法讓我們再不用sizeof的情況下找到陣列長度
Fundamental
int arr[] = {1,2,3};
printf("array=%p : &array=%p\n", arr, &arr);
這段代碼,雖然印出的結果是相同的,但是其實arr和&arr是不同的概念:
1. arr的原文解釋pointer to the first element of array
2. &arr原文解釋pointer to whole array of 3 int
int arr[] = {1,2,3};
printf("array+1 = %p : &array + 1 = %p", array+1, &array+1);
這段代碼,印出的結果可能會讓你有點驚訝,但是應用剛剛的觀念去想應該還可以
1. arr+1
則是第二個元素的位址,所以和arr
會相差4byte(假設sizeof(int)=4)
2. &arr+1
則是把整個陣列視為一個元素,則一個元素有4*3=12byte(假設sizeof(int)=4),&arr+1
則會和arr相差12byte
solution1
應用剛剛的觀念去定義一個macro,以下這個macro的好處是不用在乎變數的型態
#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;
}
solution2
#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;
}