栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

go语言与C语言的指针和引用概念 是不同的

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

go语言与C语言的指针和引用概念 是不同的

go语言与c 语言指针有不同 go的结构体,引用可以用洋葱来举例

结构体变量不加的时候表示对象值,
变量的左边, 每加一个& 表示 加了一层洋葱皮
要剥开菜叶 就必须在左侧加 *, 直到看到对象本身数据

具体是:
加 第一& 就变成引用,
再加第二个&就变成 引用的地址
再加&就变成 引用的地址的地址
以此类推
与语言c一样,包多少个& 就必须用同样数量的* 才能解开

go与c 的指针结构示意

go : (地址:结构体值) <- 引用型 <- 指针1地址 <- 指针2地址
go : (地址:普通变量) <- 指针 1地址 <- 指针2 地址 <- 指针3 地址
c: (地址:变量) <-指针 1地址 <- 指针2 地址 <- 指针3 地址

为了更好理解可以用以下代码调试
import "fmt"

type Tt1 struct {
	ss string
}


func p1() Tt1 {
	var t1 Tt1

	t1 = Tt1{
		"dfsg",
	}
	fmt.Println("1.1", t1, &t1)

	t2 := t1
	fmt.Println("1.2", t2, &t2)
	//	var t3 *Tt1
	t3 := &t1
	fmt.Println("1.3", t3, &t3, *t3)

	t4 := t3
	fmt.Println("1.4", t4, &t4, *t4)

	t5 := &t3
	fmt.Println("1.5", t5, &t5, *t5, **t5)

	t7 := unsafe.Pointer(&t1)
	fmt.Println("1.7", t7, &t7)

	return t1

}
func p2() *Tt1 {

	//var t1 *Tt1

	t1 := &Tt1{
		"dfsg",
	}
	fmt.Println("2.1", t1, &t1, *t1)

	return t1

}
func p3() {
	//普通变量
	d1 := "sdfasf"
	fmt.Println("3.1", d1, &d1)

	d2 := 123
	fmt.Println("3.2", d2, &d2)

	// 非普通变量

	d3 := [4]byte{1, 3, 4}
	fmt.Println("3.3", d3, &d3)

	d4 := []byte{1, 3, 4}
	fmt.Println("3.4", d4, &d4)

}
func main() {

	t1 := p1()
	fmt.Println("1", t1, &t1)

	t2 := p2()
	fmt.Println("2", t2, &t2)

	p3()
}
输出结果是
1.1 {dfsg} &{dfsg}
1.2 {dfsg} &{dfsg}
1.3 &{dfsg} 0xc000096558 {dfsg}
1.4 &{dfsg} 0xc000096560 {dfsg}
1.5 0xc000096558 0xc000096568 &{dfsg} {dfsg}
1.7 0xc0000a7020 0xc000096570
1 {dfsg} &{dfsg}
2.1 &{dfsg} 0xc000096580 {dfsg}
2 &{dfsg} 0xc000096578
3.1 sdfasf 0xc0000a7140
3.2 123 0xc000086480
3.3 [1 3 4 0] &[1 3 4 0]
3.4 [1 3 4] &[1 3 4]



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/869116.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号