[英]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 = ?
pc
和pi
的新值是多少?
由於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.