栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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;
 } 
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/780320.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号