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;