第三次作業總結,關於sizeof的易錯點和數組作爲函數參數的點

出現的問題

       以前是用數組做參數,都會傳遞數組的元素個數。在初始化構造函數時,因爲手機號的個數是不確定的,所以需要使用一個數組。但是 重點來了,成員函數中不存在手機號的個數這一個成員變量,所以在構造函數傳參時,我感覺不應該傳入這一個參數,應該根據實參傳遞的數組,在構造函數中找出電話的個數。

解決問題的過程

       一開始,我使用的sizeof方法。
       一開始我以爲sizeof方法就是計算數組的元素個數的。使用後發現結果不對,經過查閱資料,我才知道sizeof()計算的是變量在內存中的內存字節數。對於數組作爲參數的時候,如果不傳遞數組的元素個數無法使用。原因在下面介紹。

  • 對於普通的數據類型,指針類型
    1、sizeof指的是哪一部分內容的內存空間
int a=9;
cout<<sizeof(a);
int *p;
cout<<sizeof(p);
  • 靜態數組
    1對於靜態數組,sizeof()的值,指的是數組名指向的內容所佔的字節數
int a[6]={1,2,3};
cout<<sizeof(a);//雖然只有三個值,但是剩下的三個空間會默認初始化爲0,所以sizeof的值是6個Int型的數據所佔的內存數

        2、如何使用來計算數組的容量;注意:是容量不是元素個數

int a [6]={}1,2,3,4,5,6};
int n=sizeof(a)/sizeof(a[0]);
cout<<n;
  • 動態數組
    動態數組的數組名就是一個普通的指針變量

  • 數組作爲實參傳遞:重點
    當數組當作參數傳遞的時候它就弱化爲一個同類型指針
    也就是說,當定義了一個函數,函數的參數是一個數組,對於實參來說,是一個數組名,也就是一個指針,但是它的字節數指的是它所指向的內存的字節數。但是對於形參來說,就是一個單純的指針變量。雖然可以通過數組的方法獲取值,但是他的sizeof值即一個普通的指針類型的內存數。
    那麼此時如何獲取數組中有多少元素呢?(是元素,不是容量)(實參可以是動態數組,也可以是靜態數組)
    答:此時,要定義一個容量很大的數組,此數組的容量要大於元素個數
    然後,定義一個計數器,利用數組中存放內容的默認情況(int 默認是0,string默認是""…),當數組遍歷到默認值時,遍歷結束。傳出計數器的值

    例子如下:這是一個構造函數。其中tel初始化時,因爲不可以傳遞元素的個數,所以採用上述方法進行初始化,代碼的邏輯仔細想想便可明白
    易錯點:在main方法中,存儲tel的數組容量必須大於已經存儲的數據的個數,纔會有系統的默認值

  Person(string idnum, string pname, string *ptel, string pqq, string pweixin, string paddress) : idNum(idnum)
    {
        name = pname;

        string *p = ptel;
        int iLen = 0;
        while (p[iLen] != "")
        {
            iLen++;
            // *p++;
            p++;
            // a++;
        }
        tel = new string[iLen + 1];
        for (int i = 0; i < iLen + 1; i++)
        {
            tel[i] = ptel[i];
            // cout<<p[i]<<" ";
            // cout<<ptel[i]<<" ";
        }


        qq = pqq;
        weixin = pweixin;
        address = paddress;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章