golang中的数组与C中数组的区别

golang中的数组是这样说的: Arrays are values, not implicit pointers as in C.

1、数组做参数时, 需要被检查长度.
2、变量名不等于数组开始指针!
3、不支持C中的*(ar + sizeof(int))方式的指针移动. 需要使用到unsafe包

4、如果p2array为指向数组的指针, *p2array不等于p2array[0]


例子1 :数组做参数时, 需要被检查长度

func use_array(args [4]int) {
	args[1] = 100
}

func main() {
	var args = [5]int{1, 2, 3, 4, 5}
	use_array(args)
	fmt.Println(args)
}
编译出错:cannot use args (type [5]int) as type [4]int in argument to use_array

需要有长度上的检查

例子2: 变量名不等于数组开始指针

func use_array(args [5]int) {
	args[1] = 100
}

func main() {
	var args = [5]int{1, 2, 3, 4, 5}
	use_array(args)
	fmt.Println(args)
}
输出结果:[1 2 3 4 5]

没有保存結果, 数组名的用法与C的不一样. 在golang里是这样的:

// 有长度检查, 也为地址传参
func use_array(args *[4]int) {
	args[1] = 100 //但是使用还是和C一致,不需要别加"*"操作符
}

func main() {
	var args = [4]int{1, 2, 3, 4}
	use_array(&args) // 数组名已经不是表示地址了, 需要使用"&"得到地址
	fmt.Println(args)
}
输出结果:[1 100 3 4]
例子3 :如果p2array为指向数组的指针,*p2array不等于p2array[0]

import (
	"fmt"
)

func main() {
	var p2array *[3]int
	p2array = new([3]int)
	fmt.Printf("%x\n", *p2array+1) // 不管p2array是指针变量还是数组变量, 都只能使用"[]"方式使用
}
编译出错:invalid operation: *p2array + 1 (mismatched types [3]int and int)

golang中获取数组地址的2中方法:

func use_array(args *[4]int) {
	args[1] = 100                            //但是使用还是和C一致,不需要别加"*"操作符
	fmt.Printf("%v\n", unsafe.Pointer(args)) //获取数组地址方法1
}

func main() {
	var args = [4]int{1, 2, 3, 4}
	use_array(&args)             // 数组名已经不是表示地址了, 需要使用"&"得到地址
	fmt.Printf("%v\n", &args[0]) //获取数组地址方法2
	fmt.Println(args)
}

输出结果:

0x116b2160

0x116b2160

[1 100 3 4]






  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值