簡體   English   中英

function C 語言中的指針

[英]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 類型,從大小為1char到大小為giganticmegaobject 因此, 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 * ,因此*p1p1指向的地址處的unsigned char ,並且%02hhx將其值轉換為至少有2位的十六進制數字,必要時使用前導0位。

暫無
暫無

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

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