'& buf_pool->观看[0]&#39 ;?的语法含义是什么?

时间:2015-10-26 10:11:02

标签: c++ pointers memory-address

我在mysql的innodb缓冲区源代码的buf0buf.cc中读取代码:

link from git hub

我得到了这个:

&buf_pool->watch[0]

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

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

3 个答案:

答案 0 :(得分:5)

由于operator precedence,此表达式的解析如下:

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

在英语中,该值是watchbuf_pool成员容器的第一个元素的地址。

答案 1 :(得分:2)

你可以找到。

首先,让我们采用buf_bool变量并查找其声明。如上所示,它是一个函数参数:

const buf_pool_t* buf_pool

这意味着我们必须找到buf_pool_t类型的定义。仅使用全文搜索,不会显示类型定义。但是,使用Google搜索“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
}

答案 2 :(得分:0)

&buf_pool->watch[0]是结构watch中包含的buf_bool成员0的地址。哪个是watch本身。 它被解析为因为整个buf_pool->watch[0]得到了&amp; (地址)标志。

您可以查看以下代码段:

#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