小蚂蚁学习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

相关文章
相关标签/搜索