人生苦短我使用GO——GO指针

目录

GO指针

空指针

指向指针的指针

                多重指针示例

指针作为函数参数


GO指针

        区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。

        Go中指针很容易,使用指针可以更简单的执行一些任务。

        变量是一种使用方便的占位符,用于引用计算机内存地址。

        取地址符是&,放到一个变量前使用就会返回相应变量的内存地址。

        指针概念 一个指针变量指向了一个值的内存地址。

        类似于变量和常量,在使用指针前需要声明指针。指针声明格式如下:

var var_name *var-type
 

var-type为指针类型,var_name为指针变量名,*号用于指定变量是作为一个指针。示例中这是一个指向int和float32的指针。 

*var ip int    /*指向整型*/
var ip *float32/*指向浮点型*/

使用指针流程 ·

①定义指针变量。

②为指针变量赋值。

③访问指针变量中指向地址的值。

在指针类型前面加上*号(前缀)来获取指针所指向的内容。

示例:

package main
​
import "fmt"
​
func main() {
    var (
        a  int = 10 //声明实际变量
        ip *int     //声明指针变量
    )
    ip = &a
    fmt.Println("a的值为:", a)
    fmt.Println("a的地址:", &a)
    fmt.Println("指针ip所指向位置:", ip)
    fmt.Println("指针ip所取得值:", *ip)
}
运行结果

a的值为: 10
a的地址: 0xc000014098
指针ip所指向位置: 0xc000014098
指针ip所取得值: 10

空指针

        当一个指针被定义后没有分配到任何变量时,它的值为nil。

        nil 指针也称为空指针

nil在概念上和其它语言的null、None.nil、NULL一样,都指代零值或空值。

一个指针变量通常缩写为ptr。

示例:

package main
import "fmt"
​
func main(){
​
    var ptr *int
​
    fmt.Printf("ptr的值为:%x\n", ptr)
​
}
运行结果

ptr的值为:0
空指针判断

if(ptr l= nil)/* ptr不是空指针*/
if(ptr == nil)/*ptr是空指针*/
指针数组
示例:定义了长度为3的整形数组

package main
​
import "fmt"
​
func main() {
    var (
        a   = [3]int{10, 100, 200}
        prt [3]*int
    )
    for i := 0; i < len(a); i++ {
        prt[i] = &a[i]
​
        fmt.Printf("第%d个元素数组的指针地址%d\n", i+1, prt[i])
    }
​
    for j := 0; j < len(a); j++ {
        fmt.Printf("a的%d个元素的值=%d\n", j+1, *prt[j])
    }
}
​
运行结果

第1个元素数组的指针地址824633762152
第2个元素数组的指针地址824633762160
第3个元素数组的指针地址824633762168
a的1个元素的值=10
a的2个元素的值=100
a的3个元素的值=200

指向指针的指针

如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。当定义一个指向指针的指针变量时,第一个指针存放第二个指针的地址,第二个指针存放变量的地址:

 

指向指针的指针变量声明格式如下:

var ptr **int

示例方问指向指针的指针变量值需要使用两个*号。

package main
​
import "fmt"
​
func main() {
    var (
        a   int = 300
        ptr *int
        b   **int
    )
    ptr = &a
    b = &ptr
    fmt.Println("a的值:", a)
    fmt.Println("ptr=", ptr)         //a的存储地址
    fmt.Println("指针ptr=", *ptr)      //a的值
    fmt.Println("指向指针的指针pptr的值=", b) //存储ptr的地址
    fmt.Println(*b)                  //其实还是取了一个a的存储地址
    fmt.Println("指向指针的指针=", **b)     //pptr取值
    fmt.Println("b的地址",&b)
}
​
运行结果

a的值: 300
ptr= 0xc0000aa058
指针ptr= 300
指向指针的指针pptr的值= 0xc0000ce018
0xc0000aa058
指向指针的指针= 300
b的地址 0xc0000ce020

 

 

 

                多重指针示例

package main
​
​
​
import "fmt"
​
​
​
func main() {
​
  var a int = 5
​
  //把ptr指针 指向ss所在地址
​
  var ptr *int = &a
​
  //开辟一个新的指针,指向ptr指针指向的地方
​
  var pts *int = ptr
​
  //二级指针,指向一个地址,这个地址存储的是一级指针的地址
​
  var pto **int = &ptr
​
  //三级指针,指向一个地址,这个地址存储的是二级指针的地址,二级指针同上
​
  var pt3 ***int = &pto
​
  fmt.Println("a的地址:", &a,
​
    "\n 值", a, "\n\n",
    "ptr指针所在地址:", &ptr,
    "\n ptr指向的地址:", ptr,
    "\n ptr指针指向地址对应的值", *ptr, "\n\n",
​
     "pts指针所在地址:", &pts,
​
    "\n pts指向的地址:", pts,
​
    "\n pts指针指向地址对应的值:", *pts, "\n\n",
​
    "pto指针所在地址:", &pto,
​
    "\n pto指向的指针(ptr)的存储地址:", pto,
​
    "\n pto指向的指针(ptr)所指向的地址: ", *pto,
​
    "\n pto最终指向的地址对应的值(a)", **pto, "\n\n",
​
    "pt3指针所在的地址:", &pt3,
​
    "\n pt3指向的指针(pto)的地址:", pt3, //等于&*pt3,
​
    "\n pt3指向的指针(pto)所指向的指针的(ptr)地址", *pt3, //等于&**pt3,
​
    "\n pt3指向的指针(pto)所指向的指针(ptr)所指向的地址(a):", **pt3, //等于&***pt3,
​
    "\n pt3最终指向的地址对应的值(a)", ***pt3)
​
}
运行结果

a的地址: 0xc000014098 
 值 5 
​
 ptr指针所在地址: 0xc000006028 
 ptr指向的地址: 0xc000014098 
 ptr指针指向地址对应的值 5 
​
 pts指针所在地址: 0xc000006030 
 pts指向的地址: 0xc000014098 
 pts指针指向地址对应的值: 5 
​
 pto指针所在地址: 0xc000006038 
 pto指向的指针(ptr)的存储地址: 0xc000006028 
 pto指向的指针(ptr)所指向的地址:  0xc000014098 
 pto最终指向的地址对应的值(a) 5 
​
 pt3指针所在的地址: 0xc000006040 
 pt3指向的指针(pto)的地址: 0xc000006038 
 pt3指向的指针(pto)所指向的指针的(ptr)地址 0xc000006028 
 pt3指向的指针(pto)所指向的指针(ptr)所指向的地址(a): 0xc000014098 
 pt3最终指向的地址对应的值(a) 5

指针作为函数参数

Go 语言允许向函数传递指针,只需要在函数定义的参数上设置为指针类型即可。

以下实例演示了如何向函数传递指针,并在函数调用后修改函数内的值。

package main
​
import "fmt"
​
func main() {
    /* 定义局部变量 */
   var a int = 100
   var b int= 200
   swap(&a, &b);
​
   fmt.Printf("交换后 a 的值 : %d\n", a )
   fmt.Printf("交换后 b 的值 : %d\n", b )
}
​
/* 交换函数这样写更加简洁,也是 go 语言的特性,可以用下,c++ 和 c# 是不能这么干的 */
 
func swap(x *int, y *int){
    *x, *y = *y, *x
}
交换前 a 的值 : 100
交换前 b 的值 : 200
交换后 a 的值 : 200
交换后 b 的值 : 100

1:调用函数,主程序中的值需要函数变更后的结果,直接通过返回值的方式处理

2:调用函数,主程序中的值需要函数便后后的记过,直接传入指针变量来处理

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
指针是C编程语言中非常重要的概念之一,对于初学者来说可能会感到害怕和困惑。但只要理解了指针的原理和用法,就会发现它其实并不可怕。 首先,指针是一个存储变量地址的变量,它可以指向任何数据类型的变量,包括整型、浮点型、字符型等等。我们可以通过指针访问变量的值,也可以通过指针修改变量的值,这是指针的一大优势。 其次,理解指针的应用场景能够帮助我们更好地使用它。比如,当我们需要在函数之间传递大量的数据时,通过传递指针可以提高程序的执行效率。另外,在动态内存分配和释放中,指针也是一个必不可少的工具。 理解指针的用法也是很重要的。首先,我们需要理解指针的声明和初始化。指针的声明使用“类型 * 变量名”的语法,例如 int *ptr; 表示声明了一个指向整型变量的指针指针的初始化可以通过给指针赋值一个变量的地址或者通过取地址符&获取变量的地址。 然后,我们需要了解指针的运算。指针可以进行四种基本的运算:取地址运算符&,取值运算符*,指针加法和指针减法。取地址运算符&用于获取变量的地址,取值运算符*用于获取指针所指向的变量的值。指针加法和指针减法用于指针地址的增加和减少,不同数据类型的指针相加或相减会有不同的结果。 最后,我们需要注意指针的安全性。在使用指针的过程中,需要特别小心避免空指针、野指针等问题的出现,因为这些问题容易引发程序的崩溃或者产生不可预知的结果。 总结来说,指针作为C语言中的重要概念,我们应该尽早学习和掌握。只要理解指针的原理和用法,我们就能够更加灵活地操作内存,提高程序的效率和功能。通过不断的实践和学习,我们可以逐渐摆脱对指针的恐惧,让指针成为我们编程的得力助手。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小柏ぁ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值