'&buf_pool->watch[0]' 的语法含义是什么?

What's the grammar meaning of '&buf_pool->watch[0]'?

我在这里阅读了 mysql 的 innodb 缓冲区源代码的 buf0buf.cc 中的代码:

link from git hub

我得到了这个:

&buf_pool->watch[0]

声明的价值是多少?地址?还是其他值?

代码是什么意思?(语法意义)

由于 operator precedence,这个表达式被解析为:

&( (buf_pool->watch)[0] )

英文中,值为buf_poolwatch成员容器的第一个元素的地址。

你可以了解一下。

首先,让我们获取 buf_bool 变量并查找它的声明。正如您在上面看到的几行,它是一个函数参数:

const buf_pool_t* buf_pool

这意味着我们必须找到buf_pool_t类型的定义。仅通过全文搜索,不会显示类型定义。然而,谷歌搜索 "mysql buf_pool_t" 将我们带到 http://www.iskm.org/mysql56/structbuf__pool__t.html,这反过来告诉我们该类型是在名为 buf0buf.h 的文件中定义的。那个也包含在您链接到的源文件中:

#include "buf0buf.h"

它确实包含我们正在寻找的定义,并且该定义包含一个名为 watch:

的成员
struct buf_pool_t{

(...)

         buf_page_t*                     watch;

(...)

};

watch 是指向 buf_page_t.

的指针

所以如果我们回到你问题中的陈述:

&buf_pool->watch[0]

watch 被解释为指向 buf_page_t 数组第一个元素的指针,watch[0] 是第一个元素本身,address-of 运算符产生指向该元素的指针第一个元素。

所以整个声明如下:

指向 buf_page_t 数组第一个元素的指针。

奇怪的是,&buf_pool->watch[0] 等于 buf_pool->watch。这是一个简单的 (C++11) 玩具程序来验证所有这些:

#include <iostream>
#include <typeinfo>

using buf_page_t = int;

struct buf_pool_t {
    buf_page_t* watch;
};

int main()
{
    const buf_pool_t example = { new buf_page_t[1] };
    const buf_pool_t* buf_pool = &example; 

    std::cout << typeid(&buf_pool->watch[0]).name() << "\n";
    std::cout << typeid(buf_pool->watch).name() << "\n";
    std::cout << (&buf_pool->watch[0] == buf_pool->watch) << "\n"; // prints 1
}

&buf_pool->watch[0]是结构体buf_boolwatch的成员0的地址。这是 watch 本身。 它是这样解析的,因为整个 buf_pool->watch[0] 都在 &(地址)符号下。

您可以使用此代码段进行检查:

#include <iostream>
#include <stdio.h>
using namespace std;

struct hello_t
{
    int before;
    int array[5];
};

int main() {
    // your code goes here
    struct hello_t hello;
    hello.array[0] = 100;
    struct hello_t* ptr_hello;
    ptr_hello = &hello;
    printf("ptr_hello = %X\n", ptr_hello);
    printf("&ptr_hello = %X\n", &ptr_hello);
    printf("&ptr_hello->before = %X\n", &ptr_hello->before);
    printf("&ptr_hello->array[0] = %X\n", &ptr_hello->array[0]);

    printf("");

    return 0;
}

https://ideone.com/fwDnoz