C++ Primer指针复习(1)

最近在复习链表的同时发现自己的指针应用还是很糊涂,回来复习复习

 

指针的定义

理论上讲:指针就是保存另一个对象的地址

 

现代的C++采用vector类型和迭代器取代一般的数组,采用string类型取代c风格的字符串,所以指针+数组尽量少用

 

指针的风格

理解指针声明语句时,从右向左阅读

 

如:string *p

创建了一个指向string的指针变量p,还有int,double什么的都一样

 

指针尽量写成string *p不要写成string* p,因为在同时定义两个指针的时候可能会导致编译器理解错误,如:string* p1p2 (p1是指针,p2string变量),写成string *p1*p2就对了

 

 

指针可能取的值:

一共3种:

(1)       一个对象的地址

(2)      指向某个对象后面的一个对象

(3)      0值(表示不指向任何一个对象)

 

 未初始化的指针都是无效的,并且很危险!

应该就这么多了吧,书上写得还是很完整的


 

除非指向的对象已经存在,否则尽量不要先定义指针

 

 

指针初始化和赋值操作约束

 

int变量的值给指针是非法的(是变量哦),尽管可能这个值为0。但允许把数值0或在编译时可获得0值的const量赋给指针:

 

 

另外: 指针=Null等价于指针=0

 

Void*指针

 

void*表示“空类型指针”,与void不同,void*表示“任意类型的指针”或表示“该指针与一地址值相关,但是不清楚在此地址上的对象的类型”。(为什么不用void表示任意类型的数据呢?大家都知道,C/C++是静态类型的语言,定义变量就会分配内存,然而,不同类型的变量所占内存不同,如果定义一个任意类型的变量,如何为其分配内存呢?所以,C、C++中没有任意类型的变量。但是,所有指针类型的变量,无论是int*、char*、string*、Student*等等,他们的内存空间都是相同的,所以可以定义“任意类型的指针”)。

 

看似很强大。但void*只支持几种有限的操作:

(1)      与另一个指针进行比较

(2)      向函数传递void*指针或者返回void*指针(C++线程CreateThread操作中用到过

(3)      给另一个void*赋值

不允许void*操纵它做指向的对象

 

 

参考百度百科

按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作,即下列操作都是不合法的:

  void * pvoid;

  pvoid++; //ANSI:错误

  pvoid += 1; //ANSI:错误

//ANSI标准之所以这样认定,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的。

 

在实际的程序设计中,为迎合ANSI标准,并提高程序的可移植性,我们可以这样编写实现同样功能的代码:

  void * pvoid;

  (char *)pvoid++; //ANSI:正确;GNU:正确

  (char *)pvoid += 1; //ANSI:错误;GNU:正确

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值