c/C++計算int / int *數組的長度;sizeof(指針),sizeof(數組名)的區別

1.計算int *數組長度:ios

int arrayVlenth(float *p)
{
    int len = 0;
    while (*p)
    {
        p++;
        len++;
    }
    return len;
}

 

 

sizeof(指針),sizeof(數組名)的區別:數組

例子:函數

#include<iostream>  

void fun(int *E)  
{  
    std::cout<<"函數指針形參:"<<sizeof(E)<<std::endl;  
}  
int main()  
{  
    int A[10];  
    int *B = new int[10]; 
    //int *&C = A          //會報錯
    int *&D = B;
    std::cout<<"數組名:"<<sizeof(A)<<std::endl;  
    std::cout<<"指針:"<<sizeof(B)<<std::endl;  
    std::cout<<"指針引用:"<<sizeof(D)<<std::endl;  
    fun(A);  
}

  結果:.net

數組名:40 
指針:8 
指針引用:8 
函數指針形參:8

  

當sizeof的參數是數組名時,計算的是整個數組的存儲大小;當sizeof的參數是指針時,計算的是指針的大小(8字節,64位系統)。並且,能夠定義對指針的引用,但卻不能用數組名來做爲指針引用的右值,可見數組名和指針仍是有區別的。同時,將數組名做爲實參傳入函數時,由於形參是指針,因此在函數體內的實際上是經過數組名初始化的指針形參,故不能在函數中經過 sizeof(指針形參)/sizeof(數組元素類型) 來計算數組長度。因此通常將數組名做爲形參傳入函數時,也會同時傳遞一個數組長度的參數。
以上參考自:https://blog.csdn.net/u012707739/article/details/75732159指針

 

函數經過參數傳入一個數組的指針,如何獲取該數組的長度?code

如 int InsertSort(int* array)blog

其中array的長度如何獲取?
用過sizeof(array) / sizeof(int),始終是1內存

注意當數組做爲函數的參數進行傳遞時,該數組自動退化爲同類型的指針。get

 

sizeof是在編譯階段展開的一個宏io

 

錯誤,函數參數在運行階段以壓棧方式傳遞了一個地址

int mylen(int buf[])
{
 return sizeof(buf) / sizeof(int);
}

 

正確,由於buf的分配過程是在編譯階段定義。
int main(void)
{
 int buf[] = {0, 0, 0, 0};
 int l =sizeof(buf) / sizeof(int);
 printf("%d\n", l);
 system("pause");
 return 0;
}

 

C++/C語言沒有辦法知道指針所指的內存容量,除非在申請內存時記住它。

#define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )

 

template<class T>
int getArrayLen(T& array)
{
    return sizeof(array)/sizeof(array[0]);
}

 

原文:https://blog.csdn.net/arcticfoxhan/article/details/38752703

相關文章
相關標籤/搜索