免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

數組的三值合一-創新互聯

  在學習的過程中,發現了 一個有趣的東西,那就是數組的三值合一,不知道大家聽過沒有,我是第一次聽,原來也沒有注意到這個問題,學習過后,今天總結一下,以下就是我的一些見解。

創新互聯公司專注于網站建設,為客戶提供網站制作、成都網站制作、網頁設計開發服務,多年建網站服務經驗,各類網站都可以開發,成都品牌網站建設,公司官網,公司展示網站,網站設計,建網站費用,建網站多少錢,價格優惠,收費合理。

首先來看下邊的代碼


測試代碼一


#include<iostream>

using namespace std;

void  main()

{

int a;

int arry[10] = {0};

cout<<arry<<endl;

cout<<&arry<<endl;

cout<<&arry[0]<<endl;

cout<<sizeof(arry)<<endl;

cout<<sizeof(arry[0])<<endl;

cout<<sizeof(&arry)<<endl;

}


   對于普通×××變量a,a為變量名當賦值以后,我們就可以通過變量名操作變量中存儲的數據,那么對于數組是一類相同數據類型數據的集合,我們就不能通過數組名直接操作其中是數據,要通過數組名與下標的方式訪問,那么問題來咯,數據名是什么呢?查閱c語言的基礎語法書籍,我么可以知道,書中這樣講到:數組名的值是一個指針常量,也就是數組的第一個元素的地址。ok,我也通過程序分別求出了他們的地址,見測試結果圖一:


測試結果圖一:


數組的三值合一


對的,我們看到也就是這樣,數組名的值和數組的首元素的地址一樣,我也順便把數組名的地址也求了,現在先不用理他,我們只要看他們,數組名的值數組首元素的地址,以及數組名的地址值是一樣的,既然地址一樣那么我們是不是可以理解為他們三個是一個東西。ok,看到這里,是不是覺得博主有病,書上都講了 ,你還在這里講什么,no,我的問題剛剛開始,既然數組名和數組首元素的地址一樣,那么我們分別對他們用sizeof()函數求字節長度,按照之前的邏輯,地址一樣求得的大小是一樣的,但是結果確實不是,見測試測試結果圖一,數組名的大小是40字節個也就是數組的大小,然而對數組首元素的大小是4個字節,對于數組名的的地址求大小也是4個字節,看到這里是不是覺得有點意思,ok,接下來我們先從最簡單的開始解釋。雖然三者的值都一樣,但是代表的含義是完全不一樣的(后邊我會用代碼驗證)。

  按照我的理解,arry[0]代表數組的首元素,那么對那對他求大小的時候,那么由于此數組是一個×××數組,在win32的環境下,×××占四個字節,那么它求得的大小也就是四個字節,ok,肯定有人會說,不一定吧!為了消除大家的疑慮,我用其他類型 的數組做了測試,可以看代碼塊二 和測試結果圖二;ok,我想我把數組首元素這個解釋清楚了。


測試代碼二


void  main()

{

  char  ch[20] = {'d'};

  int arry1[10] = {0};

  double  Doub[30] = {3.14};

  cout<<sizeof(ch[0])<<endl;

  cout<<sizeof(arry1[0])<<endl;

  cout<<sizeof(Doub[0])<<endl;

}


測試結果圖二:


數組的三值合一


  繼續,按照我的理解,數組名就是代表整個數組,數組名有一個值就是數組首元素的地址,這也就解釋了為什么分別對數組名和數組首元素求地址的時候他們的值一樣,而當對他們分別用sizeof()函數求大小的時不一樣,數組名代表的整個數組的空間所以求得的大小是整個數組空間的大小,而數組首元素就是一個×××變量占四個字節,對于其他類型的數組求大小值當然不同,前邊我已經解釋過了。

  好了我們來解釋最后一個對數組名取地址,這個就是對整個數組取地址,但是數組的首元素是數組的入口,所以,我們可以看到數組名取地址和數組首元素的地址一樣,但兩者的意義是完全不一樣的??湛跓o憑,我們繼續看測試代碼三:


測試代碼三(1)


#include<iostream>

using namespace std;

void  main()

{

    int arry[10] = { 0 };

    int *p1;

    int *p2;

    int *p3;

    p1 = &arry[0];

    p2 = arry;

    p3 = &arry;

}

error C2440: “=”: 無法從“int (*)[10]”轉換為“int *” 與指向的類型無關;轉換要求 reinterpret_cast、C 樣式轉換或函數樣式轉換


測試結果圖三(1):


數組的三值合一


測試代碼三(2)


void  main()

{

    int arry[10] = { 0 };

    int *p1;

    int *p2;

    int *p3;

    p1 = &arry[0];

    p2 = arry;

    //p3 = &arry;

}


測試結果圖三(2)


數組的三值合一


  首先告訴大家這段代碼是不能編譯通過的,錯誤的,我也把錯誤信息放了上去,那么這段代碼錯誤在那塊呢?我來解釋一下,首先呢,這段代碼也解釋了我前邊說的雖然數組的三值合一,但其代表的含義是不同的,前邊講了,數組的數組名、數組的首元素的地址,數據名的地址三者值一樣。ok,首先我們分別定義了三個指針變量p1、p2、p3;由于數組首元素,就是一個×××元素,所以我們可以用一個×××指針變量接收數組首元素的地址,然后,數組名存儲著數組首元素的地址,我們就可用一個同種類型的指針變量接收,換句換說,就相當于指針變量之間的賦值;最后,我們一直強調,數組名代表整個數組,即使三者的值一樣,但是其意義是不一樣的,我們來看測試代碼三(1)的最后一行,我先說明,就是這行代碼導致編譯不能通過,運行結果如測試結果圖三(1);假如說數組名不代表整個數組,那么對它取地址是可以賦值給變量p3的,但是程序不能編譯通過,給出了測試代碼三(1)的下邊的報錯信息,注釋掉那一行后運行結果就好了,代碼如測試代碼三(2),結果如測試結果三(2)。我們很容易可以看到對于類型不一樣,不能匹配,好了寫到這里也就解釋的差不多了。最后我把今天寫的總結一下:


  數組中的三值合一:數組名、數組首元素地址、數組名的地址。但是三者代表的意義完全不同,數組名就代表整個數組,數組名中保存首元素的地址,數組首元素就是代表數組中首元素。 所以 數組名取地址 代表針對整個數組取地址,因而當對其求大小時其大小就是整個數組的大小。


另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

分享題目:數組的三值合一-創新互聯
文章源于:http://m.newbst.com/article32/iojsc.html

成都網站建設公司_創新互聯,為您提供電子商務、手機網站建設、微信小程序、域名注冊、小程序開發、網站制作

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

商城網站建設