指针难学,那是因为你对地址不了解!!!!!

前言

我是以b站某个视频来学习指针的,看完后我对指针的理解和巩固如下

学习指针中的疑问

  • 指针是什么?
  • 指针的用处又是什么?
  • 空指针和野指针又是什么?
  • 值传递和引用传递又是什么?
  • 数组指针和指针数组又是什么?

指针

看了很多博客,但是都没有大致的介绍指针到底是什么?不过看了c语言的指针才明白什么叫指针
在这里插入图片描述
其实很容易理解,不专业的将指针==地址,我这里打个常见的比方,假设内存是旅馆,那么指针就是门牌号,切记只是门牌号而是整个房间,也就是说指针就是一个标志或者说标记

模拟场景

小明失恋了,所以借酒消愁,愁更愁.一不小心就喝到12点,这时小明家离小明喝酒的地方很远,所以小明只能住旅馆了,到达旅馆前台,“老板,给我开间房”,老板很快通过电脑查了一下,看有无可用房间,发现有者标记该房间为小明所住下,然后并给小明房卡

在上面的描述中,房卡就是指针,标记该房间为小明所住下表示该指针(地址)的内容为小明

c和golang 的指针还是有区别的

  • c的指针可以进行运算,例如*(p+1)代表当前地址的下一个地址,golang为什么不让指针进行运算可能考虑到内存溢出或者访问到其他地址导致信息泄露问题
  • golang将->全部转化成了.

栈和堆

这里是个题外话,但是也挺重要的,如果学久了计算机,就很容易听到堆栈这二个字,但是却不知道到底是什么,很好,今天他来了!!!
其实通俗易懂的话就是他们的出现是为了内存更好的分配
首先讲栈主要存什么?

  • 最先要说明的是栈会存函数,而且会给函数分配一个指定的空间,而这个空间又会存储局部变量,形参,内存字段描述值
  • 栈有一个特点就是栈会自动产生和自动释放,当你用完这个函数就会自动释放
    在这里插入图片描述
    当函数1使用完后会自动释放掉函数1在栈所占用的空间,并让函数2向上移动,变成如下
    在这里插入图片描述
    注意:函数2的内存空间不变
    在说堆之前先说一下他们之间的区别吧
    在这里插入图片描述
    可以看出栈明细比堆好那么多,但为什么还要引用堆呢,那是因为栈在被内存分配的空间很少一般1M-16M,而堆随着你的内存大小在加上你的管理可能达到无限,没办法,你在少我也只能用那么一点点资源,所以我们是被迫选择用堆,虽然堆的坏处那么多不过人为了不屈服所以创建了GC(垃圾回收机制)来克服堆带来的问题,这样我们 就可以随便用堆了

指针的作用

其实指针的作用我也不是很清楚但是感觉还是蛮重要的,毕竟房卡还是很重要的,没用房卡我们可能都不知道我们要住那一间,万一乱进到一间让人羞羞的房间那岂不是赚了,个人用指针用的最多的可能还是链表,数据结构,一个指针指向另一个指针,也就是我不单单只知道我在那个房间,我还在知道我朋友在那个房间

空指针和野指针

空指针通俗易懂的话就是老板没有给你房卡,所以你根本不知道你应该入住那个房间,野指针也很好理解就是老板的孩子无理取闹随便给你了一个可能已经有入住的或者不存在的房卡给你,导致你出现了出乎意料的事情

值传递和引用传递

值传递

值传递其实很好理解,就是小明有一个长得一模一样的兄弟二明,小明先入住分配到一个房间,但是二明在入住时并不会因为你和小明张的一样就分配到小明的房间里面而是重新分配一个新的房间给你,所以二明在自己的房间里做什么都不会影响小明.

package main
import "fmt"
func test(x int){
	fmt.Println("二明的房卡为:",&x);
}
func main()  {
	x:=100;
	fmt.Printf("小明的房卡为%p\n",&x);
	test(x);
}

在这里插入图片描述

引用传递

引用传递就是共享的意思,如同某个人和你合租一间房.

package main
import "fmt"
func main()  {
	x:=100;
	//和小明进行合租,新客户获取小明房卡
	var p *int =&x;
	fmt.Println("设计前房子的内容为",x);
	//客户进行重新设计
	*p=200
	fmt.Println("客户重新设计房子后的内容为",x);
	fmt.Println("客户重新设计房子后的内容为",*p);
	//小明再次改进房子
	x=300
	fmt.Println("小明改进房子后的内容为",*p);
	fmt.Println("小明改进房子后的内容为",x);
}

在这里插入图片描述
简单易懂的话就是只要获取某个值的地址你就可以随意改变这个地址里面的值

指针数组和数组指针

在理解指针数组和数组指针前我最先想到的是这二个玩意要怎么表示

//指针数组
var p [...] *int;

//数组指针
var p2 *[...] int

看到这个情况很好区分二者
你可以进行切割法
p[…]和 *int分别表示数组和int指针,二者进行结合就变成了数组里存储int指针
p2 *和[…]int 分别表示指针和int数组,二者进行结合就变成了以指针的形式的int数组(解决了如何以指针为数据类型的数组)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值