這篇文章主要是介紹 指向指針的指針 的一種用法
上代碼(用途:使用一個函數動態申請內存,並賦值。跳出調用函數後輸出賦值內容)
[cpp]
#include <stdio.h>
#include <stdlib.h>
typedef struct Data
{
int da;
} Data;
void fun(Data *p);
int main()
{
Data *d;
fun(d);
printf("%d", d->da);
return 0;
}
void fun(Data *p)
{
p = (Data*)malloc(sizeof(Data));
p->da = 2;
}
我建議你直接運行看看結果,你會發現運行出錯,在這裏我建議你先思考再往下看
那麼再看看下面的這段代碼:
[cpp]
#include <stdio.h>
#include <stdlib.h>
typedef struct Data
{
int da;
} Data;
void fun(Data **p); //這裏改動了
int main()
{
Data *d;
fun(&d); //這裏改動了
printf("%d", d->da);
return 0;
}
void fun(Data **p) //這裏改動了
{
(*p) = (Data*)malloc(sizeof(Data)); //這裏改動了
(*p)->da = 2; //這裏改動了
}
仔細看就不難發現改動後的代碼使用了指向指針的指針
爲什麼直接使用指針會不行呢?www.2cto.com
因爲第一段代碼裏 void fun(Data *p) 中參數是按值傳遞。調用函數自動定義一個臨時變量存儲了實參的拷貝,那麼在fun中動態分配的內存,根本就不是在main函數中指針變量d 所指向的,main中指針變量d 從頭到尾都是未定義的。
如何解決這個問題?
用指向指針的指針,把main中指針變量d 的地址傳進去。這樣在fun中分配的內存空間地址就存放在指針變量d 中
說到這裏,指向指針的指針其中的一個作用就不言而喻了