【C】指针函数

指针函数

指针函数就是用到指针的函数,它是一个函数。与指针没有关系,仅仅是用到了指针。

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 &num;
}
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是堆区的,堆区内存不会自动回收,只能手动申请,手动释放。所以这样的写法也是被允许的。

总结

以上就是我对指针函数的理解,由于本人技术水平有限,若各位读者发现错误,欢迎及时纠正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是婷婷婷婷呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值