原文網址,本文並不是完全翻譯,而是自己學習後的筆記

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;
}

as23041248
4 声望1 粉丝

台灣某大學生