ポインタが上手---ポインタ値を返す関数を使用(続き)


総合的に例を挙げて説明すると,ポインタ値を返す関数を用いてメモリをポインタで渡すことも理解できる.
ポインタを返すと、ダイナミックメモリのほかに静的ストレージ領域を返すことができます.しかし、ポインタを使用してスタックメモリを渡すことはできません.スタックメモリ関数が終了すると消えてしまうため、ゴミの内容が返され、無効になります.
基本内容見:ポインタが上手---ポインタ値を返す関数を使用する
//      ,          ,          
#include<iostream>
#include<string>
using namespace std;

//      
char *TestPointerForwardValue(char *pChar2)
{
	char *pChar=new char [strlen(pChar2)+1];// strlen()            ,      1
	if(NULL==pChar)
	{
		exit(0);
	}

	strcpy(pChar,pChar2);
	cout<<pChar<<endl;
	return pChar;
}

//         
char *TestReferencePointer(char *&rpChar)
{
	char *pChar=new char [strlen(rpChar)+1];
	if(NULL==pChar)
	{
		exit(0);
	}
	strcpy(pChar,rpChar);
	cout<<pChar<<endl;
	return pChar;
}

//        :      ,          
char *TestReturnDynamicMemory(char a[])
{
	char b[100];
	char *pConst="Sichuan University!";
	char *pChar=new char [strlen(a)+strlen(pConst)+1];
	if(NULL==pChar)
	{
		exit(0);
	}
	strcpy(b,a);//            
	cout<<b<<endl;
	strcpy(pChar,a);
	strcat(pChar,pConst);
	return pChar;  //    return b,       ,             
}

//        :           
char *TestRenturStaticMeory()
{
	char *p="Diaoyu islands is Chinese inherent territory.";
	cout<<p<<endl;//            
	return p;//              
}

int main()
{
	char a1[]="Hello,Sichuan University!";
	char *p1=a1;
	char a2[]="Hello,College of Computer!";
	char *p2=a2;
	
	char *p=NULL;

	cout<<"sizeof(a1):"<<sizeof(a1)<<",sizeof(p1):"<<sizeof(p1)<<",strlen(p1):"<<strlen(p1)<<endl;

	p=TestPointerForwardValue(p1);
	cout<<p<<endl;
	delete []p;//     new     

	p=TestReferencePointer(p2);
	cout<<p<<endl;
	delete []p;//     new     

	p=TestReturnDynamicMemory(a2);
	cout<<p<<endl;
	delete []p;//     new     

	p=TestRenturStaticMeory();
	cout<<p<<endl;

	system("pause");
	return 0;
}