C语言指针要点

一个有效的指针必然是以下三种状态之一: 保存一个特定对象的地址; 指向某个对象后面的另一个对象; 或者是0值(注意只能是0常量的表达式,或者直接0。绝对不能来个变量0)

int *pi2 = & ival;
pi2 = 0;
int *pi3; //dangerous, because pi3 is uninitialized

一定要避免使用为初始化的指针:
对于绝大多数编译器来说,如果使用未初始化的指针,会将指针中存放的不确定值视为地址,然后操纵该内存地址中存放的位内容。使用未初始化的指针相当于操纵这个不确定地址中存储的基础数据。因此,在对未初始化的指针进行解引用时,通常会导致程序崩溃。
C++语言无法检测指针是否被初始化,也无法区分有效地址和由指针分配到的存储空间中存放的二进制位形成的地址。建议程序员在使用之前初始化所有的变量,尤其是指针。
如果可能的话,除非所指向的对象已经存在,否则不要先定义指针,这样可避免定义一个未初始化的指针。
如果必须分开定义指针和其所指向的对象,则将指针初始化为0。因为编译器可以检测出0值的指针,程序可判断该指针并未指向一个对象。

除了使用数值0或者在编译时为0的const常量外,还可以使用C++从C语言中继承下来的预处理器变量NULL,该变量在cstdlib头文件中定义,其值为0。如果在代码中使用了这个预处理器变量,则编译时会自动被数值0替换。因此,把指针初始化为NULL等效于初始化为0值:

//cstdlib #defines NULL to 0
int *pi = NULL; // ok:

正如其他的预处理器变量一样,不可以使用NULL这个标识符给自定义的变量命名。

void *指针
C++提供了一种特殊的指针类型void *,它可以保存任何类型对象的地址。

double obj = 3.14;
double *pd = &obj;
// ok: void* can hold the address value of any data pointer type
void *pv = &obj; //obj can be an object of any type 
pv =pd; // pd can be a pointer to any type

void*表明该指针与一地址值相关,但不清楚存储在此地址上的对象的类型。
void*指针只支持集中有限的操作:与另一个指针进行比较; 向函数传递void*指针或从函数返回void*指针; 给另一个void*指针赋值。
不允许用void*指针操纵它所指向的对象。

解释下列声明语句,并指出哪些是非法的,为什么?

const int i =0, *p = i; //合法,const int型对象i和指向const int型对象的指针p, i初始化为0, p初始化为0

已知一个指针p,你可以确定该指针是否指向一个有效的对象吗?如果可以,如何确定?如果不可以,请解释原因。

我原本的答案:可以,看该指针是否被初始化。

标准答案:不可以, 无法确定某指针是否指向一个有效的对象。因为,在C++语言中,无法检测指针是否未被初始化,也无法区分一个地址是否为有效的地址,还是由指针所分配的存储空间中存放的不确定值的二进制位形成的地址。

解释指针和引用的主要区别
1。定义引用时没有初始化时错误的。
2。赋值行为的差异:给引用赋值修改的是该引用所关联对象的值,而并不是使引用与另一个对象关联。引用一经初始化,就始终指向同一个特定的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值