小螞蟻學習C語言(22)——C語言指針——多級指針和跨函數使用內存

多級指針:把指針變量的地址放入到另外一個指針變量中去。程序員

# include <stdio.h>
int main(void)
{
    int i = 5;
    /*
        由於i是int類型,把它的指針賦值於p的時候,
        p須要是int類型的指針變量 int *
    */
    int * p = &i;
    /*
        由於p是int * 類型,把它的指針賦值於q的時候,
        q須要是int指針類型的指針變量 即 int **
    */
    int ** q = &p;
    /*
        道理同上
    */
    int *** r = &q;
    //q = &i;    error 緣由:類型不同嘛,&i是int *,q是int **
    printf("%d\n", ***r);
    /*
        輸出5,不知道怎麼用文字來描述這個結果o( ̄▽ ̄)d
    */
    return 0; 
}


動態內存和靜態內存的比較函數

    靜態內存是由系統自動分配的,有系統自動釋放spa

    靜態內存是在棧中分配的.net

    動態內存是由程序員手動分配,手動釋放指針

    動態內存是在堆分配的code


跨函數使用內存(很重要blog

/*
    跨函數使用內存
*/
# include <stdio.h>
void f(int ** q)
{
    int i = 5;
    *q = &i;
}
int main(void)
{
    int * p;
    f(&p);
    printf("%d \n",*p);
    return 0;
}
/*
    VC++6.0輸出結果:
    =========================
    5
    =========================
    備註:
        這種寫法是錯誤的!在調用完畢f函數以後,i的空間已經釋放,
        因此main函數不能對其進行操做。
        不報錯的緣由聽說是由於,軟件弱智……
*/

    

    上面的註釋已經代表了,這種寫法是錯誤的。正確的方式是建立一個動態內存。
內存

/*
    動態內存跨函數使用,
    這是正確的方式。
*/
# include <stdio.h>
# include <malloc.h>
void f(int ** q)
{
    *q = (int *)malloc(sizeof(int));
    **q = 5;
}
int main(void)
{
    int * p;
    f(&p);
    printf("%d \n",*p);    
    return 0;
}
/*
    VC++6.0輸出結果:
    =========================
    5
    =========================
    結論:
        爲指針變量p動態建立一個空間,並把地址交給p保存,
        這樣當f函數執行完畢以後,動態生成的空間不會被釋放。
*/

    恩恩,醬紫纔對    d=====( ̄▽ ̄*)bci


學PHP的小螞蟻 博客 http://my.oschina.net/woshixiaomayi/blogget

相關文章
相關標籤/搜索