指针通常用于函数中多个值的返回,而指针在函数内,其不被函数作用域所限制的只有通过指针来修改其指向的内存,而通过改向其指针方向是受到作用域的限制的。也就是说例如在函数中修改指针指向只在函数内有效,而在主函数中并没有被修改指向,但是在函数中修改指针指向的内存的值则是可以的。
#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语言的那些秘密之—函数返回局部变量