为了账号安全,请及时绑定邮箱和手机立即绑定

使用指向数组的指针

使用指向数组的指针

Go
不负相思意 2021-03-30 09:11:51
我正在尝试使用Google的Go语言,并且遇到了C语言中相当基本的东西,但到目前为止我看过的文档中似乎都没有涉及到当我将指向某个切片的指针传递给函数时,我认为我们可以通过以下方式来访问它:func conv(x []int, xlen int, h []int, hlen int, y *[]int)    for i := 0; i<xlen; i++ {        for j := 0; j<hlen; j++ {            *y[i+j] += x[i]*h[j]        }    } }但是Go编译器不喜欢这样:sean@spray:~/dev$ 8g broke.gobroke.go:8: invalid operation: y[i + j] (index of type *[]int)足够公平-这只是一个猜测。我有一个相当简单的解决方法:func conv(x []int, xlen int, h []int, hlen int, y_ *[]int) {    y := *y_    for i := 0; i<xlen; i++ {        for j := 0; j<hlen; j++ {            y[i+j] += x[i]*h[j]        }    }}但是,肯定有更好的方法。令人讨厌的是,在Go上搜索信息不是很有用,因为大多数搜索字词都会出现各种C / C ++ /无关的结果。
查看完整描述

3 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

具有Empty的类型[],例如[]int实际上是切片,而不是数组。在Go中,数组的大小是该类型的一部分,因此要真正拥有一个数组,您需要具有[16]int,而指向的指针将是*[16]int。因此,您实际上已经在使用切片,而指向切片的指针*[]int则是不必要的,因为切片已经通过引用传递了。

例子:


package main

import "fmt"


func sumPointerToArray(a *[8]int) (sum int) {

    for _, value := range *a { sum += value }

    return

}

func sumSlice (a []int) (sum int) {

    for _, value := range a { sum += value }

    return

}

func main() {

    array := [...]int{ 1, 2, 3, 4, 5, 6, 7, 8 }

    slice := []int{ 1, 2, 3, 4 }

    fmt.Printf("sum arrray via pointer: %d\n", sumPointerToArray(&array))

    fmt.Printf("sum slice: %d\n", sumSlice(slice))

    slice = array[0:]

    fmt.Printf("sum array as slice: %d\n", sumSlice(slice))

}

编辑:自首次发布以来,已更新以反映Go中的更改。


查看完整回答
反对 回复 2021-04-26
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

长度是数组类型的一部分,您可以通过len()内置函数来获取数组的长度。因此,您无需传递xlen,hlen参数。


在Go中,将数组传递给函数时,几乎总是可以使用slice。在这种情况下,您不需要指针。实际上,您无需传递y参数。这是C输出数组的方式。


在Go风格中:


func conv(x, h []int) []int {

    y := make([]int, len(x)+len(h))

    for i, v := range x { 

        for j, u := range h { 

            y[i+j] = v * u 

        }   

    }   

    return y

}

调用函数:


conv(x[0:], h[0:])


查看完整回答
反对 回复 2021-04-26
  • 3 回答
  • 0 关注
  • 193 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信