第4章 数组指针
【24】4.2下列数组的值是什么?
stringsa[10];
intia[10];
intmain(){
stringsa2[10];
intia2[10];
}
答:sa和sa2为元素类型为string的数组,自动调用string类的默认构造函数将各元素初始化为空字符串;ia为在函数体外定义的内置数组,各元素初始化为0;ia2为在函数体内定义的内置数组,各元素未初始化,其值不确定。
【25】4.3下列哪些定义是错误的?
a)intia[7]={0,1,1,2,3,3,4};
b)vector<int>ivec ={0,1,1,2,3,3,4}; 错误,vector对象不能用这种方式进行初始化;
c)intia2[]=ia; 错误,不能用一个数组来初始化另一个数组;
d)intia3[]=ivec; 错误,不能用vector对象来初始化数组。
【26】4.4如何初始化数组的一部分或者全部元素?
答:定义数组时可使用初始化列表(用花括号括住的一组以逗号分隔的元素初值)来初始化数组的部分或全部元素。如果是初始化全部元素,可以省略定义数组时方括号中给出的数组维数。如果指定了数组维数,则初始化列表提供的元素个数不能超过维数值。如果数组维数大于列出的元素初值个数,则只初始化前面的数组元素,剩下的其他元素,若是内置类型则初始化为0,若是类类型则调用该类的默认构造函数进行初始化。字符数组既可以用一组花括号括起来、逗号隔开的字面值进行初始化,也可以用一个字符串字面值进行初始化。
【27】4.5列出使用数组而不是vector的缺点。
答:与vector类型相比,数组具有如下缺点:数组的长度是固定的,而且数组不提供获取其容量大小的size操作,也不提供自动添加元素的push_back操作。因此,程序员无法在程序运行时知道一个给定数组的长度,而且如果需要更改数组的长度,程序员只能创建一个更大的新数组,然后把原数组的所有元素复制到新数组的存储空间中去。与使用vector类型相比,使用内置数组的程序更容易出错且难以调试。
【28】4.12已知一指针p,你可以确定该指针是否指向一个有效的对象吗?如果可以,如何确定?如果不可以,请说明原因。
答:无法确定某指针是否指向一个有效对象。因为,在C++中,无法检测指针是否未被初始化,也无法区分一个地址是有效地址还是由指针所分配的存储空间中存放的不确定值的二进制形成的地址。
【29】4.13下列代码中,为什么第一个指针的初始化是合法的,而第二个则不合法?
inti=42;
void*p=&i;
long*lp=&i;
答:具有void*类型的指针可以保存任意类型对象的地址,因此p的初始化是合法的;而指向long型对象的指针不能用int型对象的地址来初始化,因此lp的初始化不合法。
【30】4.15解释指针和引用的主要区别。
答:使用引用和指针都可以间接访问另一个值,但它们之间存在两个重要区别:
<![if !supportLists]>1) <![endif]>引用总是指向某个确定对象,定义引用时没有进行初始化会出现编译错误;
2)赋值行为上存在差异:给引用赋值修改的是该引用所关联的对象的值,而不是使该引用与另一个对象关联。引用一经初始化,就始终指向同一个特定对象。给指针赋值修改的是指针对象本身,也就是使该指针指向另一个对象,指针在不同时刻指向不同的对象(只要保证类型匹配);
【31】4.19解释下列5个定义的含义,指出其中哪些定义是非法的。
a)inti; 合法
b)constint ic; 非法,定义const对象时必须进行初始化,但ic没有初始化
c)constint *pic; 合法,定义了指向int型const对象的指针pic
d)int*const cpi; 非法,因为cpi被定义为指向int型对象的const指针,但该指针没有初始化
e)constint *const cpic; 非法,因为cpic被定义为指向int型const对象的const指针,但该指针没有初始化
f)inti=-1; const int ic=i; 合法,定义了一个int型const对象ic,并且用int型对象对其进行初始化
g)constint *pic=⁣ 合法,定义了一个指向int型const对象的指针pic,并用ic的地址对其进行初始化
h)int*const cpi=⁣ 不合法,cpi是一个指向int型对象的const指针,不能用const int型对象ic的地址对其进行初始化
i)constint *const cpic=⁣ 合法,定义了一个指向int型const对象的指针cpic,并用ic的地址对其进行初始化
【32】4.23下列程序实现什么功能?
constchar aaa[]={'w','s','a','x'};
constchar *p=aaa;
while(*p)
{
cout<<*p<<endl;
++p;
}
答:该程序从数组aaa的起始地址开始输出一段内存中存放的字符,每行输出一个字符,直至存放0值(null)的字节为止。
【33】4.24解释strcpy和strncpy的差别在哪里,各自的优缺点是什么?
答:strcpy和strncpy的差别在于:前者复制整个指定的字符串,后者只复制指定字符串中指定数目的字符。strcpy比较简单,而使用strncpy可以适当地控制复制字符的数目,因此比strcpy更为安全。
【34】4.26编写程序从标准输入设备读入一个string类型的字符串。考虑如何编程实现从标准输入设备读入一个C风格字符串。
答:从标准输入设备读入一个string类型字符串的程序段:
stringstr;
cin>>str;
从标准输入设备读入一个C风格的字符串可如下实现:
constint str_size=80;
charstr[str_size];
cin>>str;
【35】4.32编写程序用int型数组初始化vector对象
答:#include<iostream>
#include<vector>
usingnamespace std;
intmain()
{
constsize_t arr_size=8;
intint_arr[arr_size];
cout<<”Enter“<<arr_size<<”numbers:”<<endl;
for(size_tix=0;ix!=arr_size;++ix)
cin>>int_arr[ix];
vector<int>ivec(int_arr,int_arr+arr_size);
return0;
}