C++的运算符(四)—— () , [](函数调用和下标访问)

目录文章:C++中运算符的优先级


                                             函数调用运算符: ()

在函数名后面,通常要加上函数调用运算符,就是括号,表示调用。括号是唯一一个在重载时参数数目可变的运算符。

有一种情况,函数名后面不用加括号…………相信大家都猜到了,那就是函数指针。函数指针的定义方法如下:

返回值类型 (*函数指针名)(函数参数类型表);  //函数参数类型表是像这样的:int,double,char,int...

你想定义一个让一个月后的自己和别人都看不懂的类型吗?你可以参考这个:

unsigned long long int*****(*name)(int**(*)(double***(*)(long double*,unsigned),char****),long long*(*)(decltype(new int),unsigned short**(*)(),bool,char**(*)(char**(*)(char,unsigned char(*)(void)))));

我想谁都看不懂这个类型,这样,我加上换行和注释,再写一遍:

unsigned long long int*****                                 // 返回类型
(*name)                                                     // 函数指针名
(                                                           // 函数参数类型表的开头
    int**(*)(double***(*)(long double*,unsigned),char****), //   第一个参数
    long long*(*)(                                          //   第二个参数
        decltype(new int),                                  //     1.参数(C++11)
        unsigned short**(*)(),                              //     2.参数
        bool,                                               //     3.参数
        char**(*)(char**(*)(char,unsigned char(*)(void)))   //     4.参数
    )                                                       //   第二个参数的结尾
);                                                          // 函数参数类型表的结尾

我解释一下(注意缩进):

这是一个名为name,指向一个返回值为unsigned long long int*****(五级指针)、参数为……(暂时省略,下同)的函数。

    函数的第一个参数是一个指向返回值为int**、参数为……的函数,

        这个函数的第一个参数为一个指向返回值为double***、参数分别是 long double* 和 unsigned ,

        这个函数的第二个参数为char****(四级指针);

    函数的第二个参数是一个指向返回值为long long*、参数为……的函数,

        这个函数的第一个参数是decltype(new int),也就是int*,(请自行搜索decltype,这是C++11的关键字)

        这个函数的第二个参数是一个指向返回值为unsigned short、没有参数的函数,

        这个函数的第三个参数是bool,

        这个函数的第四个参数是一个指向返回值为char**、参数是……的函数,

            它的第一个参数是一个指向返回值为char**、参数是……的函数,

                它的第一个参数是char,

                它的第二个参数是一个指向返回值为unsigned char、参数是void(没有参数)的函数。

有趣的是,这里还不够复杂,函数指针也是可以多重的,比如下面的一行代码:

int (***fppp)(char(*****)());

可以从中看到,多重函数指针就是把第一个括号里的星号数量增多,有几个就是几级。


                                             下标访问运算符: []

说是下标访问,实际上并不一定要用数组名,指针名也可以。比如下面代码:

#include<iostream>
using namespace std;
int main(){
    int a[100];
    for(int i=0;i<100;i++) a[i]=i; //使用数组名的下标访问
    int* p=a+50; //或&a[50]   //定义p为a数组中间的元素
    for(int i=-50;i<50;i++) cout<<p[i]<<' '; //使用指针名的下标访问,虽然是负数却没有下标越界
    return 0;
}

结果:0 1 2 3 4 5 6 ... 97 98 99

这给合理的负数下标提供了可能,也简化了一些问题(比如从-100开始枚举到100)。

实际上,下标访问运算符就是这样的:(很像C++的伪代码

template<typename T>
T& operator [] (T* pointer,int subscript){ //这里是不合法的,编译器会提示应该只有一个参数
    return *(pointer+subscript);
}

而指针的加法实际上就是向后移 sizeof(T) 字节。


欢迎转载,但请在文章中附加上本文链接: https://blog.csdn.net/weixin_41461277/article/details/85329838 。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值