您的位置:首页 > 其它

C指针以及为什么不能返回局部指针变量,却可以返回局部变量

2018-02-24 10:10 495 查看
指针,是一个无符号整数(unsigned int),它是一个以当前系统寻址范围为取值范围的整数。

如:int* 是一个指针变量类型
指针变量和普通变量没有什么区别,指针32位四字节,里面保存的是一个内存空间的地址,
就像一个整形变量int a, a就可以代表一个整数,一个指针变量int* p,p就可以代表一个
地址数据,而*地址,代表去这个地址指向的内存空间取出里面的内容,因此如果是要取出
这个指针所指向的内存里面的内容就是*p,而如果是需要获得那个内存的地址,或者让另外
一个指针指向这个空间时,就可以使用int* pb;pb=p;

&变量名这是获取保存这个变量的内存空间地址
应该说c语言是门十分灵活的语言,类型几乎可以说无所谓了,有的只有内存和读取的方式
,什么几级指针,都没有意义,就算是一整形,只要强转,也可以当作地址数据来用,只是
可能会段错误,因为没有做地址映射

*p代表的是地址里面的保存的值
p代表的是一个指针变量

int* p[10]  *和[]优先级相同,平级右结合  p为一个数组,包含了10个指针变量
int (* p)[10]  p为指向一个数组的指针

为什么不能返回局部指针变量,却可以返回局部变量
函数的局部变量用作返回值时,会生成一个局部变量的拷贝用作返回值,之后局部变量会被系统回收,函数不能返回局部变量的地址,因为如果返回局部变量的地址,系统回收后,指针指向的内容就无意义了,但是对于静态变量也可以返回其指针。
#include "stdio.h"

int *a()
{
    int b;
    int *p;
    b=23;
     printf("b=%d \n",b);
    return &b;

}
void main()
{

   int *r;
   r=a();
//printf("");
   printf("r=%d",*r);
   getch();
}

如以上代码,函数返回的是局部变量的指针,此时在主函数里打印出的r应该不等于23,可是实际结果却是23,当在打印结果之前再添
加一个printf语句时打印的结果才不会是23,在CSDN上讨论:http://topic.csdn.net/u/20120206/22/487c9e4f-bf36-4ed1-9e6a-a6e7
cb7404e5.html?seed=1431559918&r=77464424#r_77464424,这里系统可能没及时回收局部变量才导致打印出的还是局部变量的值
具体的应该如下:
1. 如果返回一个基本类型的变量,比如: 
int a; 
a = 5; 
return a; 
那么就会a的一个拷贝,即5返回,然后a就被销毁了。尽管a被销毁了,但它的副本5还是成功地返回了,所以这样做没有问题。 

2. 但是对于指针,像1那么做就会有问题,比如在某个函数内部: 
int a[] = {1, 2}; 
return a; 
那么也会返回指针a的一个拷贝,我们假定a的地址值为0x002345FC,那么这个0x2345FC是能够成功返回的。当return执行完成后,a就
要被销毁,也就是0x002345FC所指向的内存被回收了。如果这时候在函数外面,去地址0x002345FC取值,那得到的结果肯定是不对的
。这就是为什么不能返回局部指针的原因。返回局部变量的引用的道理和这个类似。 

3. 对于静态变量: 
static int b=10; 
return &b; 
由于静态变量是存放在静态存储区的,所以不会被系统回收,所以返回值还是有效的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐