1.
//把数据类型去掉了看 简单很多的
指针常量
指针常量:顾名思义它就是一个常量,但是是指针修饰的。
格式为:
int * const p //指针常量
在这个例子下定义以下代码:
int a,b;
int * const p=&a //指针常量
//那么分为一下两种操作
*p=9;//操作成功
p=&b;//操作错误
因为声明了指针常量,说明指针变量不允许修改。如同次指针指向一个地址该地址不能被修改,但是该地址里的内容可以被修改
常量指针
常量指针:如果在定义指针变量的时候,数据类型前用const修饰,被定义的指针变量就是指向常量的指针变量,指向常量的指针变量称为常量指针,格式如下
const int *p = &a; //常量指针
在这个例子下定义以下代码:
int a,b;
const int *p=&a //常量指针
//那么分为一下两种操作
*p=9;//操作错误
p=&b;//操作成功
因为常量指针本质是指针,并且这个指针是一个指向常量的指针,指针指向的变量的值不可通过该指针修改,但是指针指向的值可以改变。
附加题
指向常量的指针常量该怎么写?
答案:
const int * const b = &a;//指向常量的指针常量
2.下面代码的输出结果是()
int
main(){
int
pid;
int
num=1;
pid=fork();
if
(pid>0){
num++;
printf
(
"in parent:num:%d addr:%x\n"
,num,&num);
}
else
if
(pid==0){
printf
(
"in child:num:%d addr:%x\n"
,num,&num);
}
}
1.父子进程中输出的num相同,num地址不相同
2.父子进程中输出的num不同,num地址相同
3.父子进程中输出的num相同,num地址也相同
4.父子进程中输出的num不同,num地址不相同
解析:2
刚刚fork出来不止虚拟地址一样,物理地址也一样。当进程发生分歧时,即修改此变量时,才会分配不同的物理地址,也就是copy-on-write,写时复制。
3.
#include <iostream>
using namespace std;
class B0//基类BO声明
{
public://外部接口
virtual void display()//虚成员函数
{
cout << "B0::display0" << endl;
}
};
class B1 :public B0//公有派生
{
public:
void display() { cout << "B1::display0" << endl; }
};
class D1 : public B1//公有派生
{
public:
void display(){ cout << "D1::display0" << endl; }
};
void fun(B0 ptr)//普通函数
{
ptr.display();
}
int main()
{
B0 b0;//声明基类对象和指针
B1 b1;//声明派生类对象
D1 d1;//声明派生类对象
fun(b0);//调用基类B0函数成员
fun(b1);//调用派生类B1函数成员
fun(d1);//调用派生类D1函数成员
system("pause");
return 0;
}
输出结果:B0::display0 B0::display0 B0::display0
解析:fun函数,传入的参数是一个类的对象,这样,派生类作为参数传入的时候,会自动的类型转换为基类对象,这样,display就只是执行基类的函数了。选B0::display() B0::display() B0::display()