为什么指向int的指针用“ * int”而不是“&int”初始化?

时间:2020-02-15 07:33:31

标签: pointers go reference memory-address dereference

例如,当初始化一个指向int的指针时,我们使用:

<?xml version="1.0" encoding="UTF-8"?>
<odoo>
    <data>
        <record id="farm_menu_action" model="ir.actions.act_window">
            <field name="name">Animals</field>
            <field name="res_model">farmanimal.farmanimal</field>
            <field name="view_type">form</field>
            <field name="view_mode">kanban,tree,form</field>
            <field name="domain">[]</field>
            <field name="help" type="html">
                <p class="or_view_nocontent_create">Create The First Animal

                </p>
            </field>

        </record>
        <!--farm animals tree view-->
        <record id="farm_tree_view" model="ir.ui.view">
            <field name="name">Animal Tree</field>
            <field name="model">farmanimal.farmanimal</field>
            <field name="arch" type="xml">
                <tree string="Animals">
                    <field name="name"/>
                    <field name="sex"/>
                    <field name="animal_type"/>
                    <field name="animal_dob"/>
                </tree>
            </field>
        </record>
        <!--farm animals kanban view-->
        <record id="farm_kanban_view" model="ir.ui.view">
            <field name="name">farmanimal.farmanimal.kanban</field>
            <field name="model">farmanimal.farmanimal</field>
            <field name="arch" type="xml">
                <kanban class="o_res_farm_kanban">
                    <field name="id"/>
                    <field name="name"/>
                    <field name="sex"/>
                    <field name="animal_type"/>
                    <field name="animal_dob"/>
                    <templates>
                        <t t-name="kanban-box">
                            <div t-attf-class="oe_kanban_global_click">
                                <div class="o_kanban_image">
                                    <img alt="Avatar" t-att-src="kanban_image('farmanimal.farmanimal','photo',record.id.raw_value)"/>
                                </div>
                                <div class="oe_kanban_details">
                                    <strong class="o_kanban_record_title">
                                        <field name="name"/>
                                    </strong>
                                    <div t-if="record.animal_type.value">
                                        <t t-esc="record.animal_type.value"/>
                                    </div>
                                    <div t-if="record.sex.value">
                                        <t t-esc="record.sex.value"/>
                                    </div>
                                    <div t-if="record.animal_dob.value">
                                        <t t-esc="record.animal_dob.value"/>
                                    </div>
                                </div>
                            </div>

                        </t>
                    </templates>
                </kanban>
            </field>

        </record>
        <!--farm animals form view-->
        <record id="farm_free_view" model="ir.ui.view">
            <field name="name">Animal Form</field>
            <field name="model">farmanimal.farmanimal</field>
            <field name="arch" type="xml">
                <form string="Animal">
                    <sheet>
                        <field name="photo" widget="image" class="oe_left oe_avatar" />
                        <div class="oe_title">
                            <h3>
                                <field name="name"/>
                            </h3>
                        </div>
                        <group>
                            <group>
                                <field name="animal_type"/>
                                <field name="sex"/>
                            </group>
                            <group>
                                <field name="animal_dob"/>
                            </group>
                        </group>
                        <notebook>
                          <page string="Feeding Records">

                          </page>
                          <page string="Vaccination Records">

                          </page> 
                        </notebook>

                    </sheet>
                </form>
            </field>
        </record>

        <menuitem id="main_farm_menu" name="Farm Management" />
        <menuitem id="farm_menu" name="Farm Management"
                  parent="main_farm_menu"/>
        <menuitem id="farm_animal_menu" name="Farm Animals" 
        parent="farm_menu" action="farm_menu_action"/>
    </data>
</odoo>

为什么不是语法呢?

var pointer *int

对我来说,第二个版本更有意义,因为它看起来像“变量'pointer'是一个int的内存地址”

或者换一种说法,我发现混淆“ *”既用于定义内存地址类型(如上),又用于取消引用,例如。 *指针= 123

这看起来是否令人困惑,还是我在这里遗漏了一些东西?

1 个答案:

答案 0 :(得分:5)

&address operator,而不是类型。

对于类型为x的操作数T地址操作 &x生成类型为*T的指针,指向x

但这是正确的*也用作指针间接访问

对于指针类型为x的操作数*T指针间接指向*x 表示{{ 1}}

Tour of Go中可以看到,T引用了类型和运算符。

这个thread from 2016提出了类似的问题。

当然,指针语法只是从C复制的。
另请参见Go's Declaration Syntax
如果我们使用了“ x”,那么Go指针将看起来像C ++引用。

并且:

*定义了一个指针类型,然后可以在变量上有或没有&的情况下使用。

  • 使用*int可以访问所指向的值。
  • 如果没有,您将访问所指向的内存地址。

*从变量中检索内存地址。

地址不是指针,反之亦然。
您可以使用内存地址定义指针。

*

&的值为10。
var x int = 10 // declare an int variable `x` holding the value 10. var y *int = &x // Create a pointer `y` *using* the memory address of `x`. 将是*y的内存地址


通过 Pointers in Go 在“ Dave Cheney”中查看更多信息:

Go指针与C指针一样,是指向其他值的值。这是一个非常重要的概念,不应被认为是危险的或挂在身上的。

A pointer is a value that points to the memory address of another variable

但是:

除非您为其分配了另一个地址,否则您不能更改p指向的地址
否:y个可能。

(另请参见“ Go at Google: Language Design in the Service of Software Engineering”)

一旦为指针分配了一个值(nil除外),Go就会保证所指向的对象在指针的生命周期内将继续有效。