2016-11-13 4 views
-2

Указатель ссылается на местоположение в памяти. Насколько я понимаю, все адреса памяти имеют одинаковый тип независимо от типа переменной.В чем разница между разными типами указателей?

Вместо использования разных указателей (*int, *string и т. Д.), Возможно ли это использование только одного типа (var p pointer) для всех типов указателей?

В чем разница между различными типами указателей?

package main 

import "fmt" 

func main() { 
    i := 5 
    s := "abc" 

    var pi *int  // alternatively var pi pointer 
    var ps *string // alternatively var ps pointer 

    pi = &i 
    ps = &s 

    fmt.Printf("%p %p", pi, ps) // result is 0x1040e0f8 0x1040a120 
} 

ответ

2

Система типов в Go предназначена для предотвращения ошибок памяти, связанных с указателями. Это позволяет программистам иметь достаточный контроль для управления объектами в памяти, в то время как позволяет сборщику мусора собирать тяжелый подъем.
Если вам нужна ручная память и конвертировать типы указателей, вы можете использовать unsafe package.

+0

Благодарим за сообщение. Но это объяснение далеко от меня из-за моей нехватки информации. Указатель относится к памяти, которая представлена ​​как 32-битная или 64-битная int. Это верно ?. Если эта информация верна, почему мы используем разные типы указателей, относящиеся к типу переменной? Если эта информация неверна, каково различие между различными типами указателей? –

+2

@AliAltun прежде всего, один из ключевых моментов состоит в том, что если все указатели были одинаковыми, вы потеряете информацию о типе и сделаете язык намного менее эффективным и менее безопасным. Вы не хотели бы, чтобы функция, принимающая '* int', принимала' * float', или вы теряете одно из ключевых преимуществ статически типизированных языков. –

0

Возможно ли это использование только одного типа для всех типов указателей?

Да, это в значительной степени, как работает C. К сожалению, это делает язык опасным. Скажем, у вас есть массив из 10 байтов. Если вы просто передаете указатель, другой код не будет знать, сколько байтов безопасно для доступа. Это приводит ко всем видам ошибок переполнения буфера. (т. е. HeartBleed)

В поле «Go» указатель знает тип вещи, на которую указывает, поэтому он может помешать вашему коду иметь проблемы с переполнением буфера все время.

Вы можете делать то, что хотите, но только с помощью пакета Unsafe. Как следует из названия, это очень опасно.

Возможно, если вы опубликуете то, что вы НАСТОЯТЕЛЬНО пытаетесь сделать, люди могут вам помочь. Использование небезопасных указателей - не единственный способ написать исполняемый код.

Смежные вопросы