指针 形参
2008-07-19 14:31
以前感觉自己指针还的理解的不错的!可是长久没用到道法下降很快啊! 这说明还没有深入骨髓吧!加油! #include<stdio.h> void fp( char *p) { printf("%0x %0x\n" , &p , p ); } int main() { char *p , k = 5; p = NULL ; printf("%0x %0x\n" , &p , p ); fp( p ); printf("%0x %0x\n" , &k , k ); fp( &k); return 0 ; } 输出: 1. 首先明确一点:任何编程语言的参数传递实际上都是在做传值调用. 只不过这个值对应的含义不同 所谓的传指针,就是把指针指向者的地址(一个值)传进函数. 也就是那个地址被压栈. 然后我们再通过这个地址进行操作,因为实参和形参同样都是一个地址的值. 所以改变形参指向者的状态时,实参指针也能看到这种变化. 而形参都说是实参的一个拷贝,它有自己的内存空间,sizeof 指针里面存的值就是你实参传递过来的. 传值方式时,形参的值就是实参的值 传地址方式时,形参的值就是 实参的地址 2. void test(char *ps) { ps = (char *)malloc(10*sizeof(char)); } int main(void) { char *str = NULL; test(str); strcpy(str, "abcd"); cout << str << endl; return 0; } 用指针作为参数,在函数内部申请动态内存,结果该程序会崩溃。 由于实参是个指针,形参接受到值是实参的值 NULL,在test中修改了ps的值,即让ps指向了一个内存空间.可当函数返回,ps被释放,而实参str的值还是NULL,结果还造成了内存垃圾,在test中分配的内存没有回收,也回收不了了. 所以,要想实现在调用函数的内的动态内存分配就必须使用 二重指针,否则不能实现 #include<stdio.h> #include<malloc.h> #include<string.h> void test(char **ps) { *ps = (char *)malloc(10*sizeof(char)); } int main(void) { char *str = NULL; test(&str); strcpy(str, "abcd"); printf("%s\n" , str); return 0; } 这样就能实现了!这时形参接受到的值是指针str的地址, 故在test 中*ps就能修改实参的值了.即为新分配内存的地址! 3. 在方法上,遵循一定的编码规则可能是最立竿见影的方法了,下面我来阐述一下与指针相关的编程规则: 1) 未使用的指针初始化为NULL 。 2) 在给指针分配空间前、分配后均应作判断。 3) 指针所指向的内容删除后也要清除指针本身。 |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论