Essential C++学习记录&笔记整理6(指针带来弹性)

理解Array和Vector后,我们来到了关于指针这一部分的内容

指针带来弹性

1.指针

  • 指针主要做两件事情
    ①可以增加程序本身的弹性
    ②增加了直接操作对象时所没有的复杂度

  • 通常,指针具有以下形式:
    type_of_object_pointed+_to * name_of_pointer_object

  • 指针内含特定类型对象的内存地址,在定义某个特定类型的指针时,必须在类型名称之后加上*号。eg.int *pi;

  • 若要获得对象所在的内存地址,而不是对象的值,就要使用**&(取值运算符)**。eg.&ival;此为计算ival所在的内存地址(似乎左边一般需要有个变量接着这个内存地址)

    int *pi=&ival;
    

    这种写法可以将pi的初值设置为ival所在的内存地址,这样我们可以说pi指针指向了对象ival

  • 如果我们想要访问一个由指针所指的对象,则必须对该指针执行提领(dereference,也可称解除引用)操作——即取得“位于该指针所指内存地址上”的对象(其数值一类的东西,以便对接)
    要在指针前使用*,可以达到该目的。eg.*pi=1024;,这句代码的意思是把数值1024写到pi指针所指的对象ival中,即让ival=1024;

  • 如果pi(指针)不指向任何对象,则*pi(提领pi)则会导致未知的执行结果。注意!!!
    一个未指向任何对象的指针,其地址值为0,也就是该指针是null指针。任何指针都可以被初始化,或者是令其值为0

    //例子:
    int *pi=0;
    double *pd=0;
    string *ps=0;
    
  • 为防止对null指针进行提领操作,我们可以检验该指针所持有的地址值是否为0

    if(pi&&*pi!=1024)//若pi=0(null指针),则if包含的语句不会执行,
                    //&&后面的表达式也不会执行,防止产生未知的执行结果
    	*pi=1024;
    
  • 想要检验某指针是否为null,则通常使用NOT逻辑运算符,即if(!pi)//当pi值为0时,条件表达式为true

  • 当我们需要一个指针,比如指向一个比如“元素类型为int”的vector时,就这样写vector<int> *pv=0;//指针赋初值为0(null)
    将每个数列的内存地址存入某个vector中,则可以通过索引的方式,透明地访问这些数列,比如:

    const int seq_cnt=6;
    //一个指针数组,大小为seq_cnt,每个指针都指向vector<int>对象
    vector<int> *seq_addrs[seq_cnt]={//注意>和*之前有个空格!!!
    	&fibonacci,&lucas,&pell,&triangular,&square,&pentagonal
    };   
    

    这里seq_addrs是个array,其元素类型为vector<int>*。seq_addrs[0]的值是Fibonacci vector的地址,seq_addrs[1]的值是lucas vector的地址,以此类推。可以通过一个索引值而非名称来访问各个vector:

    vector<int> *current_vec=0;
    //...
    for(int ix=0;ix<seq_cnt;++ix)
    {
    	current_vec=seq_addrs[ix];//所有要显示的元素均通过current_vec
    	//间接访问到
    }
    
  • dot成员选择运算符,即“.”,用来选择我们想要进行的操作。eg.fibonacci.empty();

  • 若要通过指针来选择操作,必须改用arrow成员选择运算符
    eg.!pv->empty();注意:由于指针可能未指向任何对象,所以在调用empty()之前,应该先检验pv是否为非零值:if(pv&&pv->empty())

  • 如果要使用下标运算符,则必须先提领pv,下标运算符的优先级较高,因此pv提领操作的两旁必须加上小括号:
    if(pv&&!pv->empty()&&((*pv)[1]==1}}其中**[ ]是下标运算符**

2.伪随机数生成器

  • rand()和srand()都是C语言标准库中的函数,即C语言标准库提供的所谓伪随机数生成器

  • 在程序中出现这两个函数(或其一)时,必须在程序开头包含#include<cstdlib>!!!

  • srand()的参数是所谓随机数生成器种子(seed),使用同种子相同的数调用 rand()会导致相同的随机数(伪随机数)序列被生成。

  • 每次调用rand(),都会**返回一个介于0和“int所能表示的最大整数”间的一个整数。**根据需要可以调整这个返回整数的范围。

  • 伪随机数生成器的代码例子:

    #include<cstdlib>
    srand(seq_cnt);//srand()用来设置rand()产生随机数时的随机数种子
    			   //如果没写这一行,系统会自动帮你调用srand()函数
    seq_index=rand()%seq_cnt;//rand()函数生成一个介于0~seq_cnt-1!!!
                             //注意是seq_cnt-1!!!这个范围的随机数,并
                             //把该随机数赋值给seq_index。
    current_vec=seq_addrs[seq_index];
    
  • 关于rand()和srand()具体的用法,可以百度一下,内容很多,这里不贴出链接了,慢慢体会吧!

发布了18 篇原创文章 · 获赞 1 · 访问量 241

猜你喜欢

转载自blog.csdn.net/weixin_45910408/article/details/105322733