多级指针:把指针变量的地址放入到另外一个指针变量中去。程序员
# 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