2014-02-26 110 views
2
#include <stdio.h> 

const char *c = "hello"; 
const char *cp = (unsigned char*)&c; 
const char *cpp = (unsigned char*)&cp; 



int main(){ 

     printf("PTR c  %p \n",c); 
     printf("PTR cp  %p \n",cp); 
     printf("PTR cpp %p \n",cpp); 

     printf("\n\n"); 

     printf("CONTENTS cp 0x%x \n",*(unsigned int*)cp); 
     printf("CONTENTS cpp 0x%x \n",*(unsigned int*)cpp); 

     printf(" \n\n Demonstrating pointer arithmetic. \n\n"); 

     printf("PTR  c  %p \n ",c); 
     printf("PTR (c+1) %p \n ",(c+1)); 


     printf("PTR  c  %p \n ",(unsigned int*)c); 
     printf("PTR (c+1) %p \n ",(unsigned int*)(c+1)); 


     printf("PTR  c  %p \n ",(unsigned long*)c); 
     printf("PTR (c+1) %p \n ",(unsigned long*)(c+1)); 

     return 0; 
} 

該程序的輸出如下試圖瞭解指針運算

PTR c  0x4007a0 
PTR cp  0x601028 
PTR cpp 0x601030 


CONTENTS cp 0x4007a0 
CONTENTS cpp 0x601028 


Demonstrating pointer arithmetic. 

PTR  c  0x4007a0 
PTR (c+1) 0x4007a1 
PTR  c  0x4007a0 
PTR (c+1) 0x4007a1 
PTR  c  0x4007a0 
PTR (c+1) 0x4007a1 

給出如果你看一下部分演示指針運算,我希望下面的結果

1)第一兩行打印「字符指針」一個地址,因此差異應該是'1' - 這就是我們正在得到的

2)接下來的兩行打印'int指針'一個地址除此之外,因此差異應該是'4' - 什麼樣的錯誤?

3)接下來的兩行打印'長指針'一個地址分開,因此差異應該是'4/8' - 什麼樣的錯誤?

+1

當你'&C'你得到一個指向'C',所以'&C '是一個指向'const char'的指針。 –

+2

我認爲你在鑄造之前遞增 –

+0

這段代碼絕對是瘋了。 'const char * cpp =(unsigned char *)&cp;'讓_no感覺不到。 –

回答

4

你是他們鑄造想要的指針

要解釋「C」作爲另一個指針之前遞增值,你應該寧願做

printf("PTR (c+1) %p \n ",(unsigned int*)c+1); 

否則括號將前向增加優先鑄造。

沒有這些括號,鑄造具有比另外更高的優先級,如以下

item = (char*)heap + offset; 

,等效於

item = ((char *)heap) + offset 

參考:優先級表C type casts and addition precedence

+1

哪一個是問題2?通過修復代碼應該工作(對於我想用戶想要的) –

+1

如果你願意,你可以編輯我的文章,但我想通過修復投射指針,程序對於#2和#3是相同的 –

+0

哦,我的,我100%誤解他在說什麼。我的appologies,刪除我的意見。 –

0

你應該投變種在添加const值之前更正指針。此外,我建議投類型unsingned很長很長,以確定64位寬度:

printf("PTR  c  %p \n ",c); 
    printf("PTR (c+1) %p \n ",(c+1)); 


    printf("PTR  c  %p \n ",(unsigned int*)c); 
    printf("PTR (c+1) %p \n ",((unsigned int*)c+1)); 


    printf("PTR  c  %p \n ",(unsigned long long*)c); 
    printf("PTR (c+1) %p \n ",((unsigned long long*)c+1)); 

,其結果是:

PTR  c  0x80485f0 
PTR (c+1) 0x80485f1 
PTR  c  0x80485f0 
PTR (c+1) 0x80485f4 
PTR  c  0x80485f0 
PTR (c+1) 0x80485f8