指针 形参
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小时内删除。