我在mysql的innodb缓冲区源代码的buf0buf.cc
中读取代码:
我得到了这个:
&buf_pool->watch[0]
声明的价值是多少?地址?或其他价值?
代码是什么意思?(语法意义)
答案 0 :(得分:5)
答案 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;
}