#include<stdio.h>
main()
{
int a[]={0,2,4,6,8};
int *ptr;
ptr=a;
printf("%d", *((char*)ptr+4));
}
*((char*)ptr+4))
這是什麼目的?什麼是*((char *)ptr + 4))?
#include<stdio.h>
main()
{
int a[]={0,2,4,6,8};
int *ptr;
ptr=a;
printf("%d", *((char*)ptr+4));
}
*((char*)ptr+4))
這是什麼目的?什麼是*((char *)ptr + 4))?
它鑄造的指針被看作是一個字符指針,再加入4看的東西4個字符後來在內存中,並最終取消引用的結果。在int
佔用4個字節的典型情況下,它將查看數組中第二個int
的第一個字節。 char
將被提升爲int
,傳遞到printf
,並打印出來。
ptr
最初指向數組的第一個值。 (char*)ptr
將其從int*
轉換爲char*
。在此char*
值中加上4將使其增加4 * sizeof(char)
,使其指向數組的第二個整數,假設32位(4字節)int和小字節平臺上的一個字節字符。外部的*
對其進行解引用,因此對輸出2
進行解引用。
如果你不是將其轉換爲char*
- 作爲*(ptr+4)
- 它會增加4 * sizeof(int)
指針,因此你已經得到了8,(a[4]
)作爲輸出。
更新:有一些樂趣!
#include<stdio.h>
main()
{
int a[]={0x00010203, 0x04050607};
int *ptr;
int i, j;
ptr=a;
for(i = 0; i < 2; i++) {
for(j = 0; j < 4; j++)
printf("%d", *((char*)ptr + 4 * i + j));
printf("\n");
}
}
我得到的輸出:
3210
7654
如果你試試這個大端機器上,你會得到
4567
因爲PTR瞭解更多關於endianness
答案只會在小端32位平臺上2。在一個big-endian平臺上,你會得到0. – 2010-07-02 05:36:34
@Jason謝謝;更新! – Amarghosh 2010-07-02 05:57:11
指向一個地址,它
* ptr是a的第一個值,或者是0.
通過將ptr轉換爲char *並添加4,代碼是說:「獲取ptr存儲的地址,向其中添加4,然後打印值在這個位置。
在這個例子中,它應該打印2
除非您正在使用,否則請勿使用所有附件。 – Amarghosh 2010-07-02 05:11:38
請注意,此代碼的行爲未按C標準定義,請勿將其用於生產代碼。特別是,結果取決於機器的字節順序。 – starblue 2010-07-02 05:54:45
它也取決於'sizeof(int)'。 – dan04 2010-07-02 06:03:14