c考試

 1.指出下面代碼的輸出,並解釋爲什麼。

main() { 
int a[5]={1,2,3,4,5};
 int *ptr=(int *)(&a+1); 
printf("%d,%d",*(a+1),*(ptr-1)); 
} 

輸出:2,5 
*(a+1)就是a[1],*(ptr-1)就是a[4],執行結果是2,5 
&a+1不是首地址+1,系統會認爲加一個a數組的偏移,是偏移了一個數組的大小(本例是5個int) int *ptr=(int *)(&a+1); 
則ptr實際是&(a[5]),也就是a+5 原因如下: 
&a是數組指針,其類型爲 int (*)[5]; 
而指針加1要根據指針類型加上一定的值, 不同類型的指針+1之後增加的大小不同 
a是長度爲5的int數組指針,所以要加 5*sizeof(int) 所以ptr實際是a[5] 
但是prt與(&a+1)類型是不一樣的(這點很重要) 所以prt-1只會減去sizeof(int*) 

a,&a的地址是一樣的,但意思不一樣,a是數組首地址,也就是a[0]的地址,&a是對象(數組)首地址,a+1是數組下一元素的地址,即a[1],&a+1是下一個對象的地址,即a[5]. 


2.關於c++ vector

//第一個生成一個vector<string>的對象,用10來初始化它,表示vector<string>這個數組的大小爲10
	//圓括號中的參數代表只分配一個對象,用圓括號中的參數作爲構造函數的參數,這種指針用 delete p; 刪除就好
	//new  vector  <string  >(10):
	//new 一個vector  <string>類型的對象,用10做參數初始化這個對象,使這個新對象可以裝10個string.返回值 也是:vector  <string >*
	vector<string> *pvec1 = new vector<string>(10);



	//而第二個生成的是一個vector<string>對象的數組,數組的每個元素是一個vector<string>,而每個vector<string>會調用默認構造函數,所以每個vector<string>的大小是0。
	//中括號中的數字代表分配的對象的個數,分配的是一個數組;這種指針在刪除的時候要用delete[] p
	//new 一個vector  <string >類型的數組,數組元素共10個,每個元素的類型是:vector <string>
	//調用默認構造函數初始化每個元素,返回值類型是:
	//vector  <string>*;
	vector<string> *pvec2 = new vector<string>[10];

int ia[10] = {-2, -1, 0, 1, 2, 1024, 1233,321};
	vector< int > ivec1( ia, ia+6 );
	vector< int > ivec2(10);
	std::cout<<ivec1.size()<<ivec2.size()<<std::endl;
	

	//
	vector<string> svec( 10 );
	//圓括號中的參數代表只分配一個對象,用圓括號中的參數作爲構造函數的參數,這種指針用 delete p; 刪除就好
	//new  vector  <string  >(10):
	//new 一個vector  <string>類型的對象,用10做參數初始化這個對象,使這個新對象可以裝10個string.返回值 也是:vector  <string >*
	vector<string> *pvec1 = new vector<string>(10);


	//中括號中的數字代表分配的對象的個數,分配的是一個數組;這種指針在刪除的時候要用delete[] p
	//new 一個vector  <string >類型的數組,數組元素共10個,每個元素的類型是:vector <string>
	//調用默認構造函數初始化每個元素,返回值類型是:
	//vector  <string>*;
	vector<string> *pvec2 = new vector<string>[10];
	vector<string> *pv1 = &svec;
	vector<string> *pv2 = pvec1;


	std::cout<<svec.size()<<" "
			 <<pvec1->size()<<" "
			 <<pvec2->size()<<std::endl;
	string *a = svec.data();
	for (int i = 0; i < svec.size(); ++i)
	{
		*a = "aaa"; 
		++a;
	}

	//for (int i = 1; i < 15; ++i)
	//{
	//	svec.push_back("aaa");
	//	pvec1->push_back("aaa");
	//	pvec2->push_back("aaa");
	//}
	std::cout<<svec.size()<<" "
			 <<pvec1->size()<<" "
			 <<pvec2->size()<<std::endl;
	delete pvec1;
	delete []pvec2;


發佈了38 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章