多級指標
多級指標案例1
# include <stdio.h>
int main(void)
{
int i = 10;
int * p = &i; //p只能存放int型別變數的地址
int ** q = &p; //q是int **型別,所謂int**型別就是指q只能存放int*型別變數的地址,
int *** r = &q; //r是int***型別, 所謂int***型別就是指r只能存放int ** 型別變數的地址
//r = &p; //error 因為r是int *** 型別,r只能存放int **型別變數的地址
//輸出結果是10 只有 ***r才表示的是i, *r或 **r或 ****r代表的都不是i
printf("i = %d\n", ***r);
return 0;
}
多級指標案列2
#include <stdio.h>
//多級指標在函式中的應用
void fmax(int ** q)
{
**q = 100; //*q就是p
}
void gmin()
{
int i = 10;
int * p = &i;
printf("i = %d *p = %d\n", i, *p);
fmax(&p); //p是int *型別 &p就是int ** 型別
printf("i = %d *p = %d\n", i, *p);
}
int main(void)
{
gmin();
return 0;
}
靜態變數不能跨函式使用
- 記憶體越界:程式訪問了一個不該被訪問的記憶體,函式內的靜態空間,不能被其他函式呼叫訪問,
- 函式中的記憶體空間,隨函式終止而被釋放,記憶體空間釋放后的內容不屬于其他函式,其他函式無權限訪問,但釋放后的記憶體空間的地址是可以被其他函式讀取的,
- 但指標變數可以存貯任何函式中靜態記憶體空間的地址,p都能存垃圾,p想存誰存誰,只是它此時已經沒有權限讀取(訪問)i這個地址的資料了,出錯,
代碼示例
# include <stdio.h>
void fmin(int ** q) //q是個指標變數,無論q是什么型別的指標變數,都只占4個位元組
{
int i = 5;
//*q等價于p q和**q都不等價于p
//*q = i; //error 因為*q = i; 等價于 p = i; 這樣寫是錯誤的
*q = &i; // p = &i;
}
int main(void)
{
int *p;
fmin(&p);
printf("%d\n", *p); // 本陳述句語法沒有問題,但邏輯上有問題
return 0;
}
動態記憶體可以跨函式使用案例
# include <stdio.h>
# include <malloc.h>
void fmax(int ** q) //*q等價p 已經宣告了q的型別為int **
{
*q = (int *)malloc(sizeof(int)); //sizeof(資料型別) 回傳值是該資料型別所占的位元組數
//等價于 p = (int *)malloc(sizeof(int));
//q = 5; //error
//*q = 5; //p = 5;
**q = 5; //*p = 5;
}
int main(void)
{
int * p;
fmax(&p); //只有呼叫變數的地址,才能改變變數的值
printf("%d\n", *p);
//fmax函式中,沒有free(q);所以動態空間仍然保留,動態空間中的內容可以被訪問
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/88381.html
標籤:JavaScript
