《C++ Primer》学习笔记(二)

    接上期。

    bitset

    § 在定义bitset时需要明确确定bitset的长度,需要在尖括号内给出长度,给出的长度必须定义为整形字面值常量或者已初始化的整形const对象。

bitset<32> bitvec;    //32位长度的bitset,以0填充

    § 初始化bitset对象的方法

//初始化bitset对象的方法
bitset<n> b; //b有n位,每位都为0
bitset<n> b(u); //b是unsigned long型u的一个副本
bitset<n> b(s); //b是string对象s中含有的位串的副本
bitset<n> b(s,pos,n); //b是s中从位置pos开始的n个位的副本

    § 使用unsigned long值作为bitset对象的初始值时,该值将转化为二进制的位模式,如果bitset类型长度大雨unsigned long值的二进制位数,则其余高阶位置为0;如果bitset类型长度小于unsigned long值的二进制位数,则只使用unsigned值中的低阶位,超过长度的将被丢弃。

bitset<16> bitvec1<0xffff>         //0-15都为1
bitset<32> bitvec2<0xffff> //0-15都为1,16-31为0
bitset<128> bitvec3<0xffff> //32-127位都为0

    § string对象与bitset对象之间是反向转化的:string的最右边字符串用来初始化bitset对象的低位。

    指针

    § 指针用来指向对象,指针也有类型,定义指针时用*号表明当前对象是一个指针

int val = 10;          //定义int型的变量val初始化值为10
int *pi = &val; //定义int型指针指向val的地址,使用&符号表示取地址
cout << pi << endl; //输出002FBA0,val对象存储的地址
cout << *pi << endl; //输出10,val的值

    § “*”号用在左操作数的时候,表示的是定义指针变量,如上面的第二个语句,用在右操作数的时候,表示解引用,如第四个语句,同样,"&”用在左操作数时是定义引用,用在右操作数时是取地址符。

    § 一个有效的指针必然是以下三种状态之一:

      a)、保存一个特定对象的地址;

      b)、指向某个对象后面的另一个对象;

      c)、0值(表示不指向任何对象)。

    § 未初始化的指针是无效的,避免使用未初始化的指针

    § void*指针可以保存任何类型对象的地址:

double obj = 3.14;
double *pd = &obj;
void *pv = &obj; //void指针可以指向任何类型变量的地址
pv = pd;

    § void*指针只支持如下几种操作:

      a)、与另一个指针进行比较;

      b)、向函数传递void*指针或者从函数返回void*指针;

      c)、给另一个void*指针赋值。

    § 对指针的操作

string str1("some value");
string *p1 = &str1; //指针指向str1的地址
*p1 = "a new value"; //通过指针修改值(修改指向对象的值)
string str2("third string");
*
p1 = &str2; //修改指针的值(改变指向的对象)

    § 指针和引用的区别

      a)、引用总是指向某个对象,而指针可以更改指向的对象

      b)、给引用赋值修改的是该引用所关联的对象的值,而不是使引用与另一个对象关联,而指针是修改指向的对象。

    § 指针的算术运算

int ia[] = {0,1,2,3,4,5,6};
int *ip = ia; //指向数组第一个元素
ip = &a[1]; //指向第2个元素
ip = ip + 4; //指向第6个元素
cout << *(ia + 2) << endl; //输出第3个元素的值(对ia+2个元素解引用)
posted @ 2012-09-25 14:49  谭文科  阅读(369)  评论(0)    收藏  举报