How to find size of array in C/C++ without using sizeof ?

原文網址,本文並不是徹底翻譯,而是本身學習後的筆記ios

Introduction

當我們要算array長度時,我們能夠使用sizeof,請參考如下代碼:spa

int size = sizeof(arr)/sizeof(arr[0]);

Problem

有沒有方法讓我們再不用sizeof的情況下找到陣列長度code

Fundamental

int arr[] = {1,2,3};
printf("array=%p : &array=%p\n", arr, &arr);

這段代碼,雖然印出的結果是相同的,可是其實arr和&arr是不一樣的概念:element

  1. arr的原文解釋pointer to the first element of arrayget

  2. &arr原文解釋pointer to whole array of 3 intit


int arr[] = {1,2,3};    
printf("array+1 = %p : &array + 1 = %p", array+1, &array+1);

這段代碼,印出的結果可能會讓你有點驚訝,可是應用剛剛的觀念去想應該還能夠io

  1. arr+1則是第二個元素的位址,因此和arr會相差4byte(假設sizeof(int)=4)stream

  2. &arr+1則是把整個陣列視為一個元素,則一個元素有4*3=12byte(假設sizeof(int)=4),&arr+1則會和arr相差12byte方法

solution1

應用剛剛的觀念去定義一個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;
}

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;
}
相關文章
相關標籤/搜索