accelerated c++第十章笔记

第十章 管理内存和低级数据结构

标准库的工具通常比核心语言提供的工具更灵活。
要理解标准库,关键是使用核心语言编程工具和技巧,我们用术语“低级”(low level)来表示这种思想,因为它们比标准库更加底层,而且更接近一般计算机硬件的工作方式,正因如此,这些方法比标准库的方法更难使用,也更危险。
使用new表达式和delete表达式来动态地分配内存,如果使用向量和链表等库函数,程序员将无权控制内存地分配。

10.1 指针与数组

指针是一种随机存取的迭代器,可以用来存取数组中的元素。

10.1.1 指针

常量0是唯一可以用来转化成指针类型的整型值,我们称0转化成的指针类型值为空指针。

int main()
{
   
    int x = 5;
    //p指向x
    int *p = &x;
    cout << "x=" << x << endl;
    //通过p改变x的值
    *p = 6;
    cout << "x=" << x << endl;
    return 0;
}
程序输出的结果为:
x = 5
x = 6

我们可以将一个对象理解成一个只包含该对象的一个元素的“容器”,而将指向该对象的指针理解成一个指向一个“容器”中唯一元素的迭代器,这对于后面的理解很重要。

10.1.2 指向函数的指针

事实上函数不是对象,我们无法对它们进行复制或赋值,也无法将它们直接作为参数。特别是,在程序中无法创建或者修改一个函数——只有编译器可以这样做。一个程序对一个函数进行的全部操作只有调用该函数,或者得到它的地址

在6.2.2中我们将函数median_analysis作为参数传递给函数write_analysis,事实上调用了以另一函数为参数的函数。在这一表象的背后,编译器悄悄地将这一调用进行了转化,实际上并没有直接调用函数本身,而是使用了指向函数的指针来进行操作。指向函数的指针与其他类型的指针使用起来也是差不多的。**一旦你间接引用一个指针,你对产生结果的函数所要做的就只能是调用它——或者说调用函数的地址。

int (*fp)(int)
//fp是指向具有一个int类型参数并返回int类型结果的函数的指针

因为你对一个函数所能做的所有操作只能是获得它的地址或者调用它,所以在任何地方如果出现一个函数名而且不是在调用该函数时,即使没有显示地使用&声明,编译器都会将它解释成该函数的地址。类似的,你也可以不用显示的间接引用一个指向函数的指针而直接调用它。

//如果我们有一个与fp类型匹配的函数
int next(int n)
{
   
    return n+1;
}
//那么我们可以通过下面两种方法中的任意一种使fp指向next函数
//下面两个语句是等价的
fp = &next;
fp = next;
//类似的,如果有一个int类型的变量i,我们要通过fp来调用next函数以使i加一,可以用下面的两种方法中的任意一种实现
//下面两个语句是等价的
i = (*fp)(i);
i = fp(i);

如果我们写了一个程序,看上去这个程序以另一个程序为参数,编译器会在背后悄悄地将该参数转化为一个指向函数的指针。

//在6.2.2的write_analysis函数中,我们将参数写成:
double analysis(const vector<Student_info>&)
//也可以等价的写成
double (*analysis)(const vector<Student_info>&)

但是这一转变对于函数的返回值却不会自动执行。如果我们想写一个返回类型为指向函数的指针的函数,其返回类型要求与write_analysis的类型一样,那么必须显示的声明该函数返回一个指针。一种实现的方法使先使用关键字typedef定义analysis_fp为一个合适的指针类型的类型名:

typedef double (*analysis_fp)(const vector<Student_info>&)

然后可以用该类型来声明我们的新函数:

//get_analysis_ptr函数的返回值为一个指针analysis函数的指针
analysis_fp get_analysis_ptr();

如果用等价

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值