2013-04-02 24 views
-1

我正在閱讀指針如何工作here,因爲我試圖理解qsort()。但導向給出了這樣的代碼:int * pint; pint =(int *)數據;意思?

// increaser 
#include <iostream> 
using namespace std; 

void increase (void* data, int psize) 
{ 
    if (psize == sizeof(char)) 
    { char* pchar; pchar=(char*)data; ++(*pchar); } 
    else if (psize == sizeof(int)) 
    { int* pint; pint=(int*)data; ++(*pint); } 
} 

int main() 
{ 
    char a = 'x'; 
    int b = 1602; 
    increase (&a,sizeof(a)); 
    increase (&b,sizeof(b)); 
    cout << a << ", " << b << endl; 
    return 0; 
} 

沒有解釋

pint=(int*)data; 

​​

的意思就行了。我明白其餘的含義,但對我來說,這對我來說(char *)數據可能意味着什麼沒有意義。它指向char的值嗎?但是如果char是一個變量類型,怎麼會這樣呢?

+4

'(int *)'將'data'強制轉換爲指向'int'的指針。 – juanchopanza

+0

http://www.learncpp.com/cpp-tutorial/613-void-pointers/ – Mati

+0

這是** C風格演員**。 –

回答

8

pint = (int*)data是做兩件事情

  1. (int*)data是從void*int*
  2. pint = ...一個轉換的值的給分配pint

最終wh此功能試圖做的是將data指向的值增加一個值。雖然a)簽名接受任何指針類型,但實現僅適用於一組固定類型,並且b)將大小與類型關聯錯誤,但它有點缺陷。

鑑於這是C++,寫一個更好的方法是使用模板。它接受支持++的所有輸入類型。

template <class T> 
void increase(T* pValue) { 
    ++(*pValue); 
} 

雖然理想情況下你只需要使用一個參考

template <class T> 
void increase(T& value) { 
    ++value; 
} 
1
pint=(int*)data; 

​​

是鑄造這些變量的指針,就像你投了一個doubleint,反之亦然。

2
(int*)data; 

(char*)data; 

是從一個指針的類型轉換到另一個,在此情況下,從void*int*char*。 ,之後的結果分配給pintpchar

2

數據作爲一個void *傳遞

(INT *)數據被強制轉換爲INT *。

1

pchar是一個指向char - 這是個什麼聲明

char* pchar; 

手段。因此,在轉讓之後

​​

pchar所指向的塊的開始指針指向data - 當你一個數字(比如5 - *(pchar+5))偏移pchar,它會指向一個內存位置即來自data所指的位置的「五個字符」。由於char是一個字節長,這意味着您將位置遞增5。由於pint已被聲明爲int* pint,所以相同的構造*(pint+5)將指向5*sizeof(int)處的位置...因此+5意味着不同的事情取決於指針是如何聲明的!

換句話說 - 聲明告訴編譯器如何處理指針所指向的對象,以及當您偏移指針(增量,減量等)時該做什麼。

0

指針與任何其他指針不相同。它不具有正常價值。它所做的只是通過保存地址來記住內存中的某個地方。

在內存中的任何地方都可以啓動任何類型的變量。通過將指針轉換爲除創建之外的其他類型(例如,例如(char*)),您可以讓程序知道,他應該在內存中處理該地點,就好像它是給定類型的變量一樣。

0

指針指向內存中的一個位置(在32位系統中,所有指針的寬度是32位,64位系統是64位)。當您編寫void* pointer時,您告訴編譯器,內存中的數據沒有類型,因此編譯器採用默認寬度來讀取內容(例如8位)。請記住,指針本身始終是32/64位,但它指向的數據不同。

例如,當你說char *指針時,它知道數據是一個字符併爲它讀取2個字節(32位)。對於int *和其他來說是一樣的。或者長*指針讀取4字節。

當你寫pchar = (char*)data你告訴CPU(實際上MMU)存儲在pchar地址的數據是一個字符,因此當我說讀取時,爲我讀取2byte。當你說(簡稱*)時,你告訴MMU爲你指針讀1byte。

如果您使用void *,系統將使用其默認大小,我認爲這是1byte。

相關問題