以指针作为实参时,实参p传递给形参p1的其实是p的拷贝,所以在局部函数中改变形参p1的指向对身处主函数的p是无影响的,但是因为p1是p的拷贝,
所以他们的指向是相同的,所以可以通过p1修改了那块内存的值。如果实参p的指向为空,也就是说p是一个空指针的话,那么它就没有指向某块内存,
形参也就无法操作p所指向的内存了(因为p本就没有指向任何一块内存),即使p1在局部函数中指向了一个malloc的空间,
这其实是改变了p1的指向(从NULL到指向malloc的空间),但是如前所述,p1只是p的拷贝,改变副本的指向对本尊是没有任何影响的,
所以对p没有影响,p还是为空。但是因为p1的生存周期是在局部函数范围内,所以一旦函数执行结束,p1这个变量就会被销毁释放,
但是那块malloc的空间却不会被释放,那就会成为空间碎片。
实参指针为空的一个例子:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void f(int *p1) 5 { 6 p1 = (int*)malloc(sizeof(int)); 7 *p1 = 100; 8 } 9 10 int main() 11 { 12 int *p = NULL; 13 f(p); 14 printf("%d", *p);//程序崩溃,因为p是空指针,试图解引用一个空指针 15 return 0; 16 }
实参指针不为空的一个例子:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void f(int *p1) 5 { 6 p1 = (int*)malloc(sizeof(int)); //改变了p1的指向,p1指向新分配的那块内存,对主函数中的p无任何影响 7 *p1 = 100; 8 } 9 10 int main() 11 { 12 int a = 10; 13 int *p = &a; 14 f(p); 15 printf("%d", *p); //输出为10 16 return 0; 17 }
传一个空指针时可以用二级指针
#include <stdio.h> #include <stdlib.h> void f(int **p1) { *p1 = (int*)malloc(sizeof(int)); **p1 = 100; } int main() { int *p = NULL; f(&p); printf("%d", *p);//程序崩溃,因为p是空指针,试图解引用一个空指针 return 0; }