HIT《C语言程序设计精髓》:指针在函数中的作用域

指针通常用于函数中多个值的返回,而指针在函数内,其不被函数作用域所限制的只有通过指针来修改其指向的内存,而通过改向其指针方向是受到作用域的限制的。也就是说例如在函数中修改指针指向只在函数内有效,而在主函数中并没有被修改指向,但是在函数中修改指针指向的内存的值则是可以的。

#include <stdio.h>
void fun(int *p);
int main()
{
	int i[]={0,1,2,3};
	int *p=i;
	fun(p);
	printf("%d\n",*p);
	return 0;
}

void fun(int *p)
{
	int *p1=p;
	p1++;
	p=p1;
}

结果是

zms@zms-virtual-machine:~/workspace/C$ cc d.c -o d.out
zms@zms-virtual-machine:~/workspace/C$ ./d.out
0
#include <stdio.h>
void fun(int *p);
int main()
{
	int i[]={0,1,2,3};
	int *p=i;
	fun(p);
	printf("%d\n",*p);
	return 0;
}

void fun(int *p)
{
	int *p1=p;
	int tem;
	p1++;
	tem=*p1;
	*p=tem;
}

结果是

zms@zms-virtual-machine:~/workspace/C$ cc d.c -o d.out
zms@zms-virtual-machine:~/workspace/C$ ./d.out
1

另外,我之前遇到的“段错误 (核心已转储)”的问题一般是数组越界,未声明指针指向内存(在函数中新定义一个指针时常犯此问题,也就是不注意指针指向的内存),可以通过gdb调试找到问题所在。

关于局部变量
在函数内,指针指向的改变是不会影响到main函数的,除非返回一个指针,也就相当于返回一个值,而这个值就是地址。之前使用指针在函数中返回多个值都是通过指针来修改主函数中变量或者数组的内存的值来实现的。

关于返回一个局部变量的指针
在函数内的变量离开函数后其内存就会被释放,因而返回一个指向局部变量的指针也就是错误的,因为它指向的地址的值已经被释放了。要返回一个指向局部变量的指针,就要为局部变量申请一个内存空间(动态内存分配),在指针的作用发挥后,要将其空间释放。

相关参考文章:C语言的那些秘密之—函数返回局部变量

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值