以前在學習資料結構的時候一直沒弄懂函式引數裡面傳遞 ** p 以及使用 &的含義,這裡摘抄了一小段文章方便理解。不懂的時候再看看這幾段**。
指標引數是如何傳遞記憶體的?
如果函式的引數是乙個指標,不要指望用該指標去申請動態記憶體。見如下例子:
void getmemory(char *ip, int num)
ip = (char *)malloc(sizeof(char) * num);
void test(void)
char *str = null;
getmemory(str, 100); // str 仍然為 null
strcpy(str, "hello"); // 執行錯誤
試圖用指標引數申請動態記憶體
毛病出在函式getmemory中。編譯器總是要為函式的每個引數製作臨時副本,指標引數ip的副本是 _ip,編譯器使 _ip = ip.如果函式體內的程式修改了_ip的內容,就導致引數ip的內容作相應的修改。這就是指標可以用作輸出引數的原因。在本例中,_ip申請了新的記憶體,只是把_ip所指的記憶體位址改變了,但是ip絲毫未變。所以函式getmemory並不能輸出任何東西。事實上,每執行一次getmemory就會洩露一塊記憶體,因為沒有用free釋放記憶體。
如果非得要用指標引數去申請記憶體,那麼應該改用「指向指標的指標」,見如下示例:
void getmemory(char **p, int num)
*p = (char *)malloc(sizeof(char) * num);
void test(void)
char *str = null;
getmemory(&str, 100); // 注意引數是 &str,而不是str
strcpy(str, "hello");
std::cout<< str << std::endl;
free(str);
這裡寫一段自己的理解:這個程式是想通過函式給str指標分配一點記憶體--malloc,然後再給str指標賦值。。。注意這是在另乙個函式內部改變str'指標的指向(str原來是指向null的,現在要使之指向函式getmemory內分配的記憶體區域)所以要使用二級指標來實現,其實質就是改變str指標的指向(比如從 指向a 改為指向b),而不是改變str指標指向位址的內容哦。
用指向指標的指標申請動態記憶體
當然,我們也可以用函式返回值來傳遞動態記憶體。這種方法更加簡單,見如下示例:
char *getmemory(int num)
char *ip = (char *)malloc(sizeof(char) * num);
return ip;
void test(void)
char *str = null;
str = getmemory(100);
strcpy(str, "hello");
std::cout<< str << std::endl;
free(str);
我們在做鍊錶的時候,我們肯定希望在用乙個函式creatlink(...)函式來增加鍊錶節點。那麼我們可以有2種方法來實現
第一種,用一級指標
typedef struct nodelist;
node *create(list *l)
int main(...)
這樣做可以達到刪除增加節點的目的,但是,在任何情況下,我們的操作都得死死地抓住頭指標,也即是我們增加刪除節點後,任何對鍊錶長度的修改,我們都要 煉表頭指標返回,即 return head;所以,我們要通過這個函式最後獲得頭指標,抓住他,死死地抓住他,然後操作。
第二種方法:用雙指標,也即是二級指標。
typedef struct nodelist;
void create(list **l)
int main(...)
總結: 如果函式引數中傳遞的是指標,而且想改變傳入指標的指向的話,則可以使用 二級指標來實現。(當然如果不在函式中的情況則可以直接給一級指標重新賦值使之指向另乙個資料)
C C 二級指標
在c c 中,二級指標是個非常重要的東西,每次用我都小心翼翼,現稍微總結一下。指標變數首先是乙個變數。而變數有兩個屬性 a.變數所在的位址addr b.變數的值 然後在c c 中,符號的功能是對變數取位址,也就是說這個符號的返回值是當前變數的位址。符號後面如果是指標變數 那麼就是取該指標變數指向的位...
CUDA中二級指標表示二級陣列
首先看下我們在cpu上是如何用二級指標表示二維陣列的,其實就兩點 一是用一級指標儲存資料,二是用二級指標去按行索引資料位置。關於一級指標和二級指標的記憶體分配這裡不講了,注意資料型別就可以了。define row 8 define col 4 宣告row個行指標 cpua cpua 0 cpua 1...
理解二級指標
我在一篇教程中看到下面這段,它描述指向指標的指標是如何運作的。引用文章相關段落如下 1 2 inti 5,j 6,k 7 int ip1 i,ip2 j 現在我們可以這麼寫 1 int ipp ip1 那麼現在指標 ipp 指向了 ip1,ip1 指向了 i。ipp 就是 ip1,ipp 就是 i,...