指针函数
指针函数就是用到指针的函数,它是一个函数。与指针没有关系,仅仅是用到了指针。
1.指针当作函数参数
所有的传参方式都是赋值
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
void modify(int count) //int count=1
{
count = 111;
}
int main()
{
int count = 1;
modify(count);
printf("%d\n", count);
return 0;
}
我们根据上面的代码和实现可以清楚的看到,这样的传参是改变不了实参的值。仅仅是对形参进行了赋值。那么,如果要改变实参的值,我们应该怎么做呢?我们可以传指针,这样说可能有点不容易想,还是直接上代码吧
#include <stdio.h>
#include <stdlib.h>
void modifyCount(int* p) //int *p=&count
{
*p = 999;
}int main()
{
int count = 1;
modifyCount(&count);
printf("%d\n", count);
return 0;
}
我们可以看到这个时候,count的值已经那这又是怎样实现的呢
这就是所谓的址传递:顾名思义,就是进行地址的传递
子函数想要修改普通变量实参,需要传入普通变量地址:一级指针,在修改的是普通变量
子函数想要修改指针变量实参,需要传入指针变量地址: 二级指针,在修改的是一级指针
对应的还有值传递,就是进行值的传递
2.指针当作函数返回值------>不能返回局部变量地址
#include <stdio.h>
#include <stdlib.h>
int* returnPoint()
{
int num = 100;
return #
}
int main()
{
int* result = returnPoint();
printf("%d\n", *result);
printf("%d\n", *result);
printf("%d\n", *result)
return 0;
}
从运行结果我们可以看出这显然是错了。这是因为num是一个局部变量,在函数调用完后,系统会回收掉它的内存空间。就是值被回收,但是内存空间还存在。这时候去在这个地址寻找这个值,显然是找不到的。
通俗的说:你在宾馆开了一间房,到点之后你就退房了。此时你肯定不在这个房间了是吧,但这个房间在客观事实上仍然存在。如果有人去房间找你,那势必是找不到的。
那第一次为什么能找到这个值呢,这是编译器的优化
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int* returnMalloc()
{
int* p = (int*)malloc(sizeof(int));
assert(p);
*p = 11334;
return p;
}
int main()
{
int* result = returnMalloc();
free(result);
return 0;
}
此时的指针可以作为返回值并且没有出错,这是为什么呢?
我们可以看到这使得指针p是堆区的,堆区内存不会自动回收,只能手动申请,手动释放。所以这样的写法也是被允许的。
总结
以上就是我对指针函数的理解,由于本人技术水平有限,若各位读者发现错误,欢迎及时纠正。