討論區快速選單
知識庫快速選單
網路投保旅行平安險 掌握Salesforce雲端管理秘訣 傑米的攝影旅遊筆記
[ 回上頁 ] [ 討論區發言規則 ]
陣列&sizeof
更改我的閱讀文章字型大小
作者 : angerala(Angerala)
[ 貼文 9 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/11/22 上午 09:47:50
程式碼:
#include <iostream>
using namespace std;

int main()
{
    int iArray[] = {1,2,3,4,5};
    int nArray[5] = {6,7,8};

cout << iArray陣列大小為: << sizeof(iArray) << "個位元組" << endl;

cout << nArray陣列大小為: << sizeof(nArray) << "個位元組" << endl;

for(int i=0;i<5;i++)
   cout << "iArray[ " << i << " ] = << iArray[i] << '\t' << "nArray[" << i << "] =" << nArray[i] <<endl;
    }
}

輸出結果:
iArray 陣列的大小為 20個位元組
nArray 陣列的大小為 20個位元組
iArray[0] = 1 nArray[0] = 6
iArray[1] = 2 nArray[1] = 7
iArray[2] = 3 nArray[2] = 8
iArray[3] = 4 nArray[3] = 0
iArray[4] = 5 nArray[4] = 0

我不懂 sizeof 運算子的用法
如果 iArray 整數資料行別占用4個位元組,所以有5個整數陣列元素
5*4=20個位元組記憶體空間~(iArray 陣列的大小為 20個位元組)我可以理解

不能理解為什麼nArray也是20個位元組
還是sizeof運算子能抓取陣列也能抓取元素呢?
可是cout輸出的語法都是一樣,如何判斷它是抓陣列或是元素...

或者我根本理解錯誤,還是所占的記憶體的空間是看『變數型態』??
char..int..long..float..double..long double...
作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 408 | 人氣 0 | 評價 1890 | 評價/貼文 4.63 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人angerala註記此篇回應為很有道理 2013/11/22 上午 10:44:41
nArray[5],你都已經給他 5 了,他當然是 5 個元素啊!這裡有數字的話是以這裡為主,這裡沒有數字的話才是看初始化的內容。
作者 : angerala(Angerala)
[ 貼文 9 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/11/22 上午 11:24:28
所以是:
int iArray[] = {1, 2, 3, 4, 5};
     ↓ [0][1][2][3][4]←記憶體
     沒有指派初值

int nArray[5] = {6,7,8};
     ↓
     [5]
     6 7 8 0 0
     [0][1][2][3][4]
請問是這樣理理解嗎!!
作者 : angerala(Angerala)
[ 貼文 9 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/11/22 上午 11:30:04
int iArray[] = {1, 2, 3, 4, 5};
沒有指派初值

{1, 2, 3, 4, 5}
[0][1][2][3][4]←記憶體


int nArray[5] = {6,7,8};
初值為5

{6, 7, 8} 0 0
[0][1][2][3][4]

沒有給初值看元素
有給初值不看元素
意思是這樣嗎!!!

上面那篇排版有問題,這樣因該比較清楚
作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 408 | 人氣 0 | 評價 1890 | 評價/貼文 4.63 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人angerala註記此篇回應為很有道理 2013/11/22 下午 01:32:43
您說的大致上對了,不過那個大括弧 {...} 的東西才是我們所謂的初值,至於 nArray[5] 的那個 5 在整個程式執行的過程並不能被改變,也就沒有所謂初不初值的問題。
基本上一個陣列的元素數量是必須要指定的,只是在後面有設定陣列初始內容時這個動作可以交給編譯器代勞,讓他自己計算陣列初值有幾個元素然後自己填進去這樣而已。
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4498 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/11/22 下午 01:49:49
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf

c99 draft specification - 6.5.3.4 section about sizeof operator
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人angerala註記此篇回應為最佳解答 2013/11/22 下午 10:34:55
>int iArray[] = {1, 2, 3, 4, 5};
>沒有指派初值

不對. 上面這句有初始值. 在 C 及 C++ 語言裡, 「初始值」(initializers) 指的是在物件定義語句裡, 用來初始化該物件的東西. 在這個句子裡, {} 內的東西就叫「初始值列」 (initializer list). 這裡加了『列』是因為它們是「一系列」的初始值.
 

>{1, 2, 3, 4, 5}
>[0][1][2][3][4]←記憶體
>
>
>int nArray[5] = {6,7,8};
>初值為5

方括號 ([]) 內的 5 不叫初始值. 初始值是 {} 內的 6, 7, 8.
這個才叫沒有初始值:
  int uninitializedArray[10];

'5' 是用來設定陣列長度的常數值, 不是也不能叫「初始值」, 但也沒有特定名字.

>{6, 7, 8} 0 0
>[0][1][2][3][4]
>
>沒有給初值看元素
>有給初值不看元素
>意思是這樣嗎!!!

在 C 及 C++ 語言裡, 陣列在定義時必須給長度, 這長度在設定後就不能在執行期更改 (C99 以後的 C 語言標準有 variable-length array, 但那是另一個話題).

陣列的長度有兩種設定的方法, 一是直接給長度, 像:
  int array[100];

這個寫法有沒有初始值都可以, 但如果沒有給初始值, 編譯器不會去特定初始化它的內容 (debug mode 除外, 有些編譯器在 debug build 會把所有沒有初始化的物件設一個特定值, 方便程式員 debug).
如果有給初始值, 編譯器會用 {} 裡的值去設相應的元素內容, 其餘的就會設為 0 值.

(以上是簡化的解釋, 語言標準文件會有更詳盡的定義, 像「沒有給初始值」的初始化叫 default initialization, 「設為0值」的初始化叫 zero-initialization)

如果你有一個很大的陣列, 你要把它們設定為 0 值, 有一個很簡單的寫法:
  int bigArray[200] = { 0 };

如果是 C++ 或 C99 或以後的編譯器, 可以更簡單一些:
  int bigArray[200] = {};

有兩個要點:
1. 沒有相應初始值的元素只能設為 0 值, 如果你想設為其它值, 目前標準語法還無法做.

2. 如果 {} 內初始值列的數量不能超過陣列大小, 如果超出, 則編譯錯誤:
  int wrongSize[3] = {1, 2, 3, 4, 5}; /* error */


另外一個陣列長度設定的方法是: 透過初始值列的數量來設定陣列大小:
  int array[] = {1, 2, 3, 4, 5}; /* 5 個元素 */

編譯期能夠從初始值的多少來決定陣列的大小, 這可以看成是編譯器給程式員的一個方便: 你只需更改初始值的部份, 編譯器自動調整陣列大小.


作者 : angerala(Angerala)
[ 貼文 9 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/11/23 上午 10:59:59
謝謝各位指導
 板主 : 青衫 , Raymond
 > Visual C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++
1 青衫 11070 
2 Raymond 10090 
3 Clier 7630 
4 小約翰 2500 
5 Cog 2030 
6 coco 1870 
7 aming 1410 
8 牧童哥 1400 
9 r2109 1380 
10 Akira 1350 
Visual C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.15625