2013-02-22 46 views
1
client_t *client_create_no_window(char *in, char *out); 

// ... 

char line[50]; 
while((c = getchar()) != EOF && c != '\n') 
{ 
    line[pos] = c; 
    pos++; 
} 
pos=0; 

的整數,然後我嘗試先做演員到指針從不同大小

char* first = (char*) line[1]; 
char* second= (char*) line[2]; 
client_create_no_window(first, second); 

我不斷收到錯誤鑄造不同尺寸的整數指針調用該函數client_create_no_window。我看了一些關於這些以前的職位,但仍然無法理解爲什麼這是怎麼回事

+0

對不起。只是一個錯字。我會編輯它 – user1665569 2013-02-22 14:30:57

回答

2
char line[50]; 

定義字符數組。第二個字符(line[1])存儲在內存中的地址中,該地址可通過使用「地址」運算符(&):&line[1]來檢索。

char* second = (char*) line [1]; 

需要第二個字符(line[1])並將它轉換到指針char,這是不正確。

char* second = &line[1]; 
+0

就是這樣。非常感謝 – user1665569 2013-02-22 14:38:57

+1

-1,第一個和第二個字符確實不在這些索引處。 – unwind 2013-02-22 14:39:10

+0

我知道第一行是[0]。我其實首先將變量命名爲零。我知道這很奇怪。它幫助我記住 – user1665569 2013-02-22 14:41:21

2

此::指向第二個字符應使用的地址,在這個角色所在初始化

char*first = (char*) lines[1]; 

採取字符lines[1],將其轉換通過強制投給char * (指向字符的指針,即地址),並將其存儲在字符指針first中。

這是錯誤的,因爲字符不是地址,所以這個賦值沒有意義。

你想要什麼可能是這個角色,您可以通過使用操作員「的地址」獲得的地址,&:這也可以使用指針運算書面

char *first = &lines[1]; 

爲:

char *first = lines + 1; 

但是請注意,從零是c索引,所以第一個字符是真的在lines[0]

char *first = &lines[0]; 

lines[1]

char *second = &lines[1]; 
+0

我知道該行[0]是第一個。我實際上將變量命名爲零,第一個等等。我知道這很奇怪,但它幫助我記住了職位。謝謝 – user1665569 2013-02-22 14:43:12

1

首先,我敢肯定,這只是一個錯字,但你申報char lines[],而不是char line[]。其次,您是否想將line[0]的地址填入first?這將是:分別

char *second = &line[1]; 

通知所述第一和第二字符是在索引0和1,:

char *first = line; 

或者

char *first = &line[0]; 

同樣。

+0

我知道那行[0]是第一個。我實際上將變量命名爲零,第一和第二。我知道這很奇怪。它幫助我記住 – user1665569 2013-02-22 14:42:21

0

更改您的代碼,如下所示(假設您確實試圖將指針指向行[1]和行[2]的值)。如果你想點行的地址[1]和線[2]你會做&線[]如上面描述的,你將不必使用reinterpret_cast的停止有關大小的警告信息:

line[1] = 2; 
line[2] = 0x234234; 

char* first = reinterpret_cast<char *>(line[1]); 
char* second= reinterpret_cast<char *>(line[2]); 
client_create_no_window(first, second); 

第一將指向0x000002 第二將指向0x234234

的reinterpret_cast的取值,並將其投射的類型和大小給定指針的。在較舊的編譯器中,只是在執行char * ptr =(char *)23時足夠好,但新編譯器知道int(23將存儲在int中)不是指針的大小(通常爲64位),並且它會生成警告消息。 reinterpret_cast修復了這個問題。