指针作为形参肯定有很多都不清楚其中具体的原理,我也是最近摸清了些门道:
下面就用一些例子来给大家说明:
void myMalloc(char *s) //我想在函数中分配内存,再返回 { s=(char *) malloc(100); } void main() { char *p=NULL; myMalloc(p); //这里的p实际还是NULL,p的值没有改变,为什么? if(p)
<span style="font-family: Arial, Helvetica, sans-serif;">free(p); </span>
}
基于上面的问题: 因为指针作为形参传递过去的是它的拷贝,只是说他们指向同一块内存地址。
上面其实是给他的拷贝体进行了内存地址分配
void myMalloc(char **s) { *s=(char *) malloc(100); } void main() { char *p=NULL; myMalloc(&p); //这里的p可以得到正确的值了 if(p) free(p); }
这里为什么能得到正确的值了呢?
因为这里形参分配的内存其实是给s本身在分配了 ,上面分配的时候用的是(*s)
#include<stdio.h> void fun(int *p) { int b=100; p=&b; } main() { int a=10; int *q; q=&a; printf("%d/n",*q); fun(q); printf("%d/n",*q); return 0; }
这里打印的结果为: 10 10
为什么呢? 因为main函数中q指针作为形参传递给了fun函数,fun函数中p为q指针的拷贝体,f
fun函数中的p在函数体中重新指向了整数b的地址。所以q指针本身的值是没有发生变化的
#include<stdio.h> void fun(int *p) { *p=100; } main() { int a=10; int *q; q=&a; printf("%d/n",*q); fun(q); printf("%d/n",*q); return 0; }
这里打印的结果是: 10 100
这里可以正确打印我们想要的结果了,因为main函数中的q指针和形参中的p指针都指向了整数a的地址。
fun函数中其实是修改整数a地址中的值,所以在后文中打印指针q中的内容时,也能打印出100了
时间: 2024-10-16 22:35:25