c考试

本文详细解析了C++中Vector的两种创建方式及其区别,通过实例对比了直接初始化与数组初始化的不同效果。同时,深入探讨了C语言中指针与数组的复杂关系,特别是针对指针运算中的常见误区进行了澄清。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值