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;