指针数组直接输出指针数组变量报错,是什么原因?

yangzhengxing · 2018-04-03 20:54:16 · 1007 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-04-03 20:54:16 的主题,其中的信息可能已经有所发展或是发生改变。
作者设置必须登录才能查看,请登录;如没有账号,请注册

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1007 次点击  
加入收藏 微博
7 回复  |  直到 2018-04-04 21:51:14
lepig
lepig · #1 · 7年之前

new(int)是一个指针 应该改成这样吧

func main() {
    arr := [2]*int{new(int), new(int)}
    *arr[0] = 2
    *arr[1] = 3
    fmt.Printf("%v", arr)
}
yangzhengxing
yangzhengxing · #2 · 7年之前

func main() { arr := [2]int{new(int), new(int)} arr[0] = 2 arr[1] = 3 fmt.Printf("%v", arr) } 输出的结果是数组中每个值相对应的地址:[0xc42000e250 0xc42000e258] 输出arr会报错: invalid indirect of arr (type [2]*int),请教。

yangzhengxing
yangzhengxing · #3 · 7年之前
lepiglepig #1 回复

`new(int)`是一个指针 应该改成这样吧 ```go func main() { arr := [2]*int{new(int), new(int)} *arr[0] = 2 *arr[1] = 3 fmt.Printf("%v", arr) } ```

func main() { arr := [2]int{new(int), new(int)} arr[0] = 2 arr[1] = 3 fmt.Printf("%v", arr) } 输出的结果是数组中每个值相对应的地址:[0xc42000e250 0xc42000e258] ;而输出arr会报错: invalid indirect of arr (type [2]int),请教。

terender
terender · #4 · 7年之前
yangzhengxingyangzhengxing #3 回复

#1楼 @lepig func main() { arr := [2]int{new(int), new(int)} arr[0] = 2 arr[1] = 3 fmt.Printf("%v", arr) } 输出的结果是数组中每个值相对应的地址:[0xc42000e250 0xc42000e258] ;而输出*arr会报错: invalid indirect of arr (type [2]*int),请教。

你这段代码编译都编译不过

arr := [2]int{new(int), new(int)}

这里 arr 是个 int 数组,包含2个类型是 int 的元素。

new(int) 返回一个*int,也就是指向 int 变量的指针

你在初始化 int 数组时用 *int 来赋值肯定不对啊

terender
terender · #5 · 7年之前
yangzhengxingyangzhengxing #3 回复

#1楼 @lepig func main() { arr := [2]int{new(int), new(int)} arr[0] = 2 arr[1] = 3 fmt.Printf("%v", arr) } 输出的结果是数组中每个值相对应的地址:[0xc42000e250 0xc42000e258] ;而输出*arr会报错: invalid indirect of arr (type [2]*int),请教。

如果你需要 arr 是一个 int 数组,包含2个类型是 int 元素,那么楼上已经给出了正确的代码实现

在这种情况下

arr[0] = 2

这样复制也是不行的,因为 arr[0] 是一个指针,你不能直接把一个整形常数赋给一个指针。

如果你是要给 arr[0] 这个指针所指向的内存赋值,那么需要

*arr[0] = 2
yangzhengxing
yangzhengxing · #6 · 7年之前
terenderterender #4 回复

#3楼 @yangzhengxing 你这段代码编译都编译不过 arr := [2]int{new(int), new(int)} 这里 arr 是个 int 数组,包含2个类型是 int 的元素。 new(int) 返回一个*int,也就是指向 int 变量的指针 你在初始化 int 数组时用 *int 来赋值肯定不对啊

我写错误了,是这样的:func main() { arr := [2]int{new(int), new(int)} arr[0] = 2 arr[1] = 3 fmt.Printf("%v", arr) } 输出的结果是数组中每个值相对应的地址:[0xc42000e250 0xc42000e258] ;而输出arr(即fmt.Printf("%v",arr))会报错: invalid indirect of arr (type [2]int);请问是什么原因?

terender
terender · #7 · 7年之前
yangzhengxingyangzhengxing #6 回复

#4楼 @terender 我写错误了,是这样的:func main() { arr := [2]*int{new(int), new(int)} arr[0] = 2 arr[1] = 3 fmt.Printf("%v", arr) } 输出的结果是数组中每个值相对应的地址:[0xc42000e250 0xc42000e258] ;而输出*arr(即fmt.Printf("%v",*arr))会报错: invalid indirect of arr (type [2]*int);请问是什么原因?

你写的还是不对,还是编译不过

arr := [2]int{new(int), new(int)}

只要这样写就编译不过,因为 new(int) 的类型是指针,不能给 int 数组赋值

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传