'&buf_pool->watch[0]' 的语法含义是什么?
What's the grammar meaning of '&buf_pool->watch[0]'?
我在这里阅读了 mysql 的 innodb 缓冲区源代码的 buf0buf.cc
中的代码:
我得到了这个:
&buf_pool->watch[0]
声明的价值是多少?地址?还是其他值?
代码是什么意思?(语法意义)
由于 operator precedence,这个表达式被解析为:
&( (buf_pool->watch)[0] )
英文中,值为buf_pool
中watch
成员容器的第一个元素的地址。
你可以了解一下。
首先,让我们获取 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_bool
中watch
的成员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;
}
我在这里阅读了 mysql 的 innodb 缓冲区源代码的 buf0buf.cc
中的代码:
我得到了这个:
&buf_pool->watch[0]
声明的价值是多少?地址?还是其他值?
代码是什么意思?(语法意义)
由于 operator precedence,这个表达式被解析为:
&( (buf_pool->watch)[0] )
英文中,值为buf_pool
中watch
成员容器的第一个元素的地址。
你可以了解一下。
首先,让我们获取 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_bool
中watch
的成员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;
}