C語言中二級指標使用
阿新 • • 發佈:2019-02-16
C/C++中使用指標可以減少函式傳遞的引數
例如:
typedef struct
{
int r[MAX];
int length;
}SqList;
呼叫void test(SqList s)
函式時,會把結構體SqList
拷貝一份傳入函式,這樣就使得效率變低。
使用指標可以傳遞結構體,或者陣列
二維指標主要用在在子函式中有新生成的變數需要回傳回主函式。
void main()
{
SqList S;
S.length = 10;
SqList* l = &S;
void test3(SqList* s);
std ::cout << l << " " << l->length << std::endl;
test3(l);
std::cout << l << " " << l->length << std::endl;
SqList** ll = &l;
std::cout << ll << " " << *ll << " " << " " << (*ll)->length << std ::endl;
void test(SqList** s);
test(ll);
std::cout << ll << " " << *ll << " " << " " << (*ll)->length << std::endl;
}
void test(SqList** s)
{
*s = (SqList*)malloc(sizeof(SqList));
(*s)->length = 1;
std::cout << s << " " << *s << " " << " " << (*s)->length << std::endl;
}
void test3(SqList* s)
{
s = (SqList*)malloc(sizeof(SqList));
s->length = 1;
std::cout << s << " " << s->length << std::endl;
}
結果如下
0037EA24 10
0043AE80 1
0037EA24 10
0037EA18 0037EA24 10
0037EA18 0043BEC0 1
0037EA18 0043BEC0 1
使用一級指標時,使用malloc
函式重新生成的結構體變數將無法傳回主函式,而是用二級指標則可以實現回傳。
需要注意:二級指標僅僅是把新分配的記憶體地址返回去,在堆上空間的分配和回收是由程式設計師自己完成,所以可以正確返回新分配的記憶體地址的值,而那些在棧上分配空間的變數,則不能用二級指標傳值,因為區域性變量出了作用域就會被編譯器釋放,例如用在int型時,由於int型區域性變數是在棧上分配儲存空間的,所以回傳回去實際值已經被釋放,返回的值就是錯誤的。如下:
void main()
{
int a = 10;
int* p=&a;
int** ptr;
ptr = &p;
std::cout << ptr << " " << *ptr << " " << **ptr << std::endl;
void test2(int** a);
test2(ptr);
std::cout << ptr << " " << *ptr << " " << **ptr << std::endl;
}
void test2(int** a)
{
int b = 5;
*a = &b;
std::cout << a << " " << *a << " " << **a << std::endl;
}
輸出結果:
003DEBA8 003DEBB4 10
003DEBA8 003DEAB0 5
003DEBA8 003DEAB0 13083592