2016-09-25 47 views
-1

在我的C++類中,我的老師給了我這個代碼。瞭解與指針相關的sizeof

#include <iostream> 

using std::cout; 
using std::endl; 

int main() 
{ 
    char numbers[]{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
      11, 12, 13, 14, 15, 16, 17 }; 
    char *ptrNumber; 
    ptrNumber = &numbers[0]; 

    // Address of first and last index 
    cout << (size_t)(ptrNumber) << " to " << (size_t)(ptrNumber + 17) << endl; 
} 

它打印

12647972 to 12647989 

現在我以前認爲一個指向字符的大小,將有1個字節,它意味着:(size_t)(ptrNumber)(size_t)(ptrNumber+17)將打印1.我要去哪裏錯了?謝謝。

+0

這不是'sizeof'運算符,您只是將指針的值(內存地址)轉換爲名爲'size_t'的類型(這是sizeof的返回類型) – eavidan

+0

您在輸出'Address第一個和最後一個索引「,這就是你正在打印的內容。這是轉讓的要求嗎? – lakeweb

+0

@lakeweb我剛剛複製並粘貼了幻燈片中的代碼,但現在我明白了我對sizeof與size_t – IntegrateThis

回答

2

您打印的內容不是指針的大小(它通常是4或8字節),而是指針存儲的地址。所以程序顯示第一個和最後一個元素所在的內存地址。 size_t這裏與sizeof運營商沒有任何關係;你只能演員演員。如果您刪除size_t,則最終將打印由char數組表示的字符串。但是因爲你的數組並不代表一個合法的C字符串(沒有零終止符和不可顯示的字符),你很可能最終會出現一個段錯誤。

+0

'char *'確實不打印十六進制到cout。 – Yakk

+0

@Yakk謝謝,糾正,由於某種原因錯過了'char'部分。 – vsoftco

1

A char是一個字節,根據您的機器和環境,指向字符的指針通常佔用32位(4字節)或64位(8字節)。這是最後的地址。