![](/img/trans.png)
[英]Difference between the address of a pointer and the address that a pointer contains
[英]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.