c++结构比数组的行为更接近基本的“单值变量”

简单示例

//返回一个结构  示例1
struct travel_time{
	int hours;
	int mins;
	}
	......
travel_time sum(travel_time t1, travel_time t2){
	travel_time total;
	total.mins = (t1.mins + t2.mins) % Mins_per_hr;
	total.hours = t1.hours + t2.hours + 
					(t1.mins + t2.mins) / Mins_per_hr;
	return total;
	}

//返回一个数组 示例2
char *GetMemory( void ) 
{  
 char p[] = "hello world";  
 return p;  
} 
void Test( void ) 
{  
 char *str = NULL;  
 str = GetMemory();  
 printf( str );  
} 

c++能返回结构而不能返回数组

对于示例1来说,total仅仅是一个结构名,而不是一个结构的地址,&total才是结构的地址;对于示例2来说,p不仅仅是一个字符数组(字符串)的名字,还是这个字符数组(字符串)的首个字符的地址。

当示例2试图返回数组p时,Tes函数的str变量只是的到了p指针的一个拷贝,由于GetMemory结束后,被函数调用栈弹出,原先p指向的字符串“hello world”占用的内存已经被收回。Test无法通过p指针的拷贝str, 再次访问到“hello world”字符串。
示例1和示例2相比,可以看出:函数可以像返回int型变量一样返回结构型变量。而不能像返回int型变量一样返回数组型变量(至少静态联编不行)。也就是说,c++结构比数组的行为更接近基本的“单值变量”。

进阶版间接返回数组

要想返回数组,或者说,返回指向数组的指针(可以说是数组名,或者数组第一个元素的地址),就不能使用系统栈来保存数组,避免函数一结束,数组占用的内存就被收回。不使用像“ int a[8] \ char [4]"这种方式声明,定义的数组?对的,我们将使用动态内存。使用free或者new运算符调用库函数为我们分配一段动态内存,这段内存来自堆空间一处略长的(物理上不连续的,更像链表)地址。举个例子:

int* itemp = new int;
//将返回一段int类型大小的堆内存的首地址, 赋值给iptr
double dtemp = new double;
//将返回一段double类型大小的堆内存的首地址, 赋值给dptr
char* cptr = new char[12];
//将返回一段有12个char类型大小的堆内存的首地址, 赋值给cptr

间接返回数组示例3

char *GetMemory( void ) 
{  
 char* p = new char[12];
 p = "hello world";  
 return p;  
} 
void Test( void ) 
{  
 char *str = NULL;  
 str = GetMemory();  
 printf( str );  
 delete[] p;
 p = nullptr;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值