大二寒假读书笔记150131

来源:互联网 发布:mysql卸载后重装不了 编辑:程序博客网 时间:2024/03/29 21:27

今天去帮老妈一同事买电脑,以比线上均价高出280的价格拿下貌似是有点坑,不过送了个无线网卡和8g优盘(不值什么钱我知道,,,),看来以后帮人忙还是要做足功课,另外了解用户需求也很重要。本以为是要去买笔记本,这我想着笔记本我熟啊,当年买笔记本从3000不到的大神船看到某星人17,这点姿势我还是足够哒。万万没想到是要台!式!机!好吧,随便了,至少我在不会让阿姨被坑的太狠,,也只能这么想来劝服自己还是有”价值“的了。。。

1、指针提供间接操纵其所指对象的功能。可用指针进行解引用去访问它所指的对象。

解引用操作符返回指定对象的左值,利用这个功能可修改指针所指对象的值:

string s("hello world");string *sp = &s;cout<<*sp;*sp = "goodbye";//修改指针所指对象的值
也可修改指针sp本身的值:

string s2 = "some value";sp = &s2;
给指针直接赋值即可修改指针的值——不需要对指针进行解引用。

2、指针和引用的比较

虽然使用引用和指针都可间接的访问一个值,当它们之间有两个区别:

一是引用总是指向某个对象:定义引用是没有初始化是错误的

二是给引用赋值修改的是该引用所关联的对象的值,而并不是使引用与另一个对象关联在一起

int ival = 1024,ival2 = 2048;int *pi = &ival,*pi2 = &ival2;pi = pi2;//赋值结束后,pi所指向的ival对象的值不变,赋值操作修改了pi指针的值,使其指向另一个对象int &ri = ival,&ri2 = ival2;ri = ri2;//此赋值操作修改了ri引用的值的ival对象,而非引用本身。赋值后,这两个引用还是指向原来关联对象,此时这两个对象的值相等

指针本身也是可用指针指向的内存对象。指针占用内从空间存放其值,因此指针的存储空间可存放在指针中。而为了真正访问到指向指针的指针所指的对象,必须对指向指针的指针进行两次解引用。

int ival = 1024;int *pi = &ival;int **ppi = &pi;cout<<"The value of ival\n"      <<"direct value:"<<ival<<"\n"      <<"indirect value:"<<*pi<<"\n"      <<"doubly indirect value:"<<**ppi      <<endl;
都是1024.

3、指针访问数组元素

基础不说了,发现自己效率好低。也不能全怪天冷。

只要两个指针指向同一数组或有一个指向该数组末端的下一个单元,C++还支持对这两个指针做减法操作:

int ia[] = {0,1,2,3,4,5,6};int *ip = ia;//会自动转换为 指向数组第一个元素的指针,ip points to ia[0]int *ip2 = ip + 4;//ip2 points to ip[4]ptrdiff_t n = ip2 - ip;//结果是4,表明这两个指针所指元素间隔为4个对象。
两个指针减法操作的结果是标准库类型ptrdiff_t。与size_t类型一样,它也是一种与机器相关的类型,在cstddef头文件中定义。size_t 是unsigned类型,ptrdiff_t则是signed类型。因为它有可能是负数。

在指针上加上一个整型数值,结果仍是一个指针,允许在这个结果上直接进行解引用操作。

int last = *(ia + 4);
因为解引用操作符的优先级比加法操作符优先级高,所以必须加上括号。


4、我们已经看到,在表达式中使用数组名,实际上使用的是指向数组的第一个元素。

其中一个重要的应用是使用下标访问数组时,实际上是使用下标访问指针:

int ia[] = {0,2,4,6,8};int i = ia[0];//0int *p = &ia[2];//int j = p[1];//6,p[1] equivalent to *(p+1),ia[3]int k = p[-2];//0,p[-2] equivalent to *(p-2),ia[0]

5、前面说过数组和指针就像低级的vector和迭代器。

vector类型提供的end操作将返回指向超出vector末端位置的一个迭代器,常用作哨兵,来控制循环。类似的,可以计算数组的超出末端指针的值。

const size_t arr_size = 5;int arr[arr_size] = {1,2,3,4,5};int *p = arr;int *p2 = p + arr_size;//p+5指向数组超出末端的位置
注意:C++允许计算数组或对象超出末端的地址,但不允许对此地址进行解引用操作。而计算数组超出末端位置之后或数组首地址之前的地址都是不合法的。

所以上面的p2只能用来和其他指针比较,作为判断循环的条件使用,对p2的解引用将得到无效值,对于大多是编译器会把p2进行解引用的结果(恰好存储在arr数组的最后一个元素后面的内存中的二进制位)视为一个int数据。

const size_t arr_sz = 5;int int_arr[arr_az] = {0,1,2,3,4};for(int *pbegin = int_arr,*pend = int_arr + arr_sz;pbegin != pend;++pbegin)    cout<<*pbegin<<',';
和vector相比,指针就是数组的迭代器。

6、今天就此结束,明天涉及的const指针和指向const对象的指针,还有指向const对象的const指针以及typedef修饰指针有点烦,攒点精力

0 0
原创粉丝点击