多級指針 多級指針案例1 多級指針案列2 靜態變數不能跨函數使用 1. 記憶體越界:程式訪問了一個不該被訪問的記憶體,函數內的靜態空間,不能被其他函數調用訪問。 2. 函數中的記憶體空間,隨函數終止而被釋放。記憶體空間釋放後的內容不屬於其他函數,其他函數無許可權訪問。但釋放後的記憶體空間的地址是可以被其他函數讀 ...
多級指針
多級指針案例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;
}