簡體   English   中英

C程序返回0,而指針指向值3

[英]C programme return 0 while the pointer point to value 3

我以為程序結束時il將打印3,但實際上它是0。

誰能解釋這是怎么回事?

這是代碼:

int arr[3] = {2, 3, 4};
char *p;
p = arr;
p = (char*)((int*)(p)); // two conversion, means nothing, omit
printf("%d, ", *p);     // point to 2, 
p = (int*)(p+1);  // point to 3 ?
printf("%d", *p);
return 0;

您正在將整數數組視為char數組。 標記為“沒有任何意義”的行實際上意味着很多。

當將char* p遞增1時,會將指針移動1個字節,但是要指向arr[1] ,則需要將其sizeof(int)個字節遞增。 p聲明為int* p ,然后p+1將完成您需要的操作。

由於p為char類型,因此p+1指向第一個整數的開頭之后的一個字節。 因此,當通過解引用p讀取一個字節時,您正在讀取包含零字節的整數數組中的位置。

如果增加一個指針,則該指針將增加其類型的大小。 這里p是字符指針,如果增加p則指向下一個字符。 由於字符為1個字節,因此p+1指向由p指向的下一個字節。 如果p是一個整數指針,則p+1將指向代碼中的下一個整數i,e 3。

這是怎么回事?

以下各行以int 格式打印char 內容 (此處為*p )。

char *p;
printf("%d, ", *p);

因為(當前)機器是低端字節序(例如x86),所以它打印2 如果此代碼在big-endian機器上運行,則將輸出0 [有關字節序,請參閱http://en.wikipedia.org/wiki/Endianness ]

練習:如果將數組初始化更改為以下內容,則預期的打印輸出是什么?

int arr[3] = {0x1a2b3c4d, 3, 4};

指針增量

假設我們有

char * pc = 0xA0;
int  * pi = 0xB0;

pc += 1;    // pc = ?
pi += 1:    // pi = ?

pcpi的新值是多少?

由於pc是指向char的指針,因此+ 1 pc sizeof(char) ,即1。

但是,由於pi是指向int的指針,因此+ 1 pi增加sizeof(int) 在32位系統中, sizeof(int)通常為4,而在64位系統中, sizeof(int)通常為8。

pc += 1;    // pc = 0xA1
pi += 1:    // pi = perhaps 0xB4 or 0xB8

警示語

出於知識和好奇心的考慮可以進行實驗,但是在實際代碼中,通過將int的字節轉換為char *來訪問int的字節不是一個好主意,它會導致各種字節序可移植性問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM