簡體   English   中英

將“指針指向指針”和“指針地址”傳遞給函數之間的區別

[英]Difference between passing “pointer to pointer” and “address of pointer” to a function

我有一個帶char **的函數; 它在內部使用它來維護連續調用之間的上下文。

定義char **x並將x傳遞給它,與定義char *x並傳遞&x什么區別?


對於上下文:在閱讀源代碼之前,我嘗試自己在strtok手冊頁上實現示例。 而且我遇到了段錯誤。 然后經過嘗試,我查看了源代碼。

問題是我定義了char **x並將x作為**saveptr參數傳遞,但是將定義更改為char *x並傳遞給&x解決了問題。

到底是什么問題?

第一個版本,帶有char **x; 並傳遞x ,創建並使用未初始化的指向char的指針。
第二個版本,帶有char * x; 並傳遞&x ,創建指向char的未初始化指針,但是傳遞一個值,該值是指向char的指針的有效地址,並且是定義的值(即,類似於指向未初始化的指向char的指針的指針)。

基本上,對於第一個版本,您要求在內存中的“隨機”位置進行寫(這是獲得段錯誤的幾乎肯定的方法); 其次,您要求寫入現有的指針變量。

當您定義例如

char **x;

然后,您只需定義一個指針。 它不是指向另一個指針的指針,重要的是它只是一個指針。 因此,使用上面顯示的定義,它尚未初始化。 它沒有特別之處。 像在函數中最有可能那樣取消引用它會導致未定義的行為

另一方面,像

char *x;

並使用&x指向它的指針, &x返回的指針指向有效的變量x 取消引用&x將允許該函數訪問和修改x本身。

以這種方式使用address-of運算符是一種模擬C所沒有的按引用傳遞的方式。

因為所有函數參數都 C中的值傳遞 ,所以如果您定義char **x並傳遞x ,則函數將不會對其進行修改。 如果定義char *x並傳遞&x ,則可以對其進行修改(更改其指向地址)。

暫無
暫無

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

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