[英]Pointers in a function C language
您好,我是 C 語言的新手,並試圖理解指針。
做一些例子我偶然發現了這個 function 並且我不完全確定它是關於什么的。
void dump(void *p, int n)
{
unsigned char *p1 = p;
while (n--)
{
printf("%p - %02x\n", p1, *p1);
p1++;
}
}
我不明白unsigned char *p1 = p;
p
在 function 中沒有其他用途。 我也不太明白printf("%p - %02x\n", p1, *p1);
p1
,它是 *p1 指針的實際值嗎?
誰能向我解釋這個話題? 我將不勝感激。
在示例中,它向我展示了當 ai 使用此 main() 運行時
int main(void)
{
int i = 10000;
dump(&i, sizeof(i));
return 0;
}
output 是
0x7ffd7e787e74 - 10
0x7ffd7e787e75 - 27
0x7ffd7e787e76 - 00
0x7ffd7e787e77 - 00
unsigned char *p1 = p;
在 function 中沒有其他用途。
但是還有。 void
沒有大小,並且void*
上的算術在嘗試將指針步進到所指出類型的下一個元素時不知道“步進”多遠,如p1++;
方法。 添加1
后應該指向哪里?
另一方面,作為最小可尋址實體的char
具有明確定義的大小 ( 1
),而p1++
的含義與在 memory 中步進一個char
(字節)相同,從而指向下一個char
(字節)。
void
是特殊的。 您不能實例化/存儲void
。 void
用於定義沒有返回值的過程/函數, void func(...);
. 這也是用來定義不接受任何 arguments, ... func(void);
的 function .
void*
可用於指向任何大小的 object 類型,從大小為1
的char
到大小為gigantic的megaobject
。 因此, void*
通常用於接受指向任何類型的 object 的指針 - 但是,實際上將指針向前步進1
意味着“步進到內存中所指出類型的下一個 object”,這也意味着編譯器需要知道大小object 的指針指向。 將void*
轉換為(unsigned) char*
並使用該指針可以讓 function 步驟( p1++
)在 memory 中前進,一次一個字節。
unsigned char *p1 = p;
將p
的值從void *
轉換為unsigned char *
並將其存儲在p1
中。 這種轉換產生了相同的地址,但信息指向不同的類型。
printf("%p - %02x\n", p1, *p1);
應該是printf("%p - %02hhx\n", (void *) p1, *p1);
. 在此, %p
格式化傳遞給它的地址( p1
的值)以進行顯示,因此它以人類可讀的方式顯示 memory 地址。 由於p1
的類型是unsigned char *
,因此*p1
是p1
指向的地址處的unsigned char
,並且%02hhx
將其值轉換為至少有2
位的十六進制數字,必要時使用前導0
位。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.