指针案例和使用陷阱|学习笔记

简介: 快速学习指针案例和使用陷阱。

开发者学堂课程【GO 语言核心编程-基础语法、数组、切片、Map:指针案例和使用陷阱】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/625/detail/9535


指针案例和使用陷阱

 

内容介绍:

一、案例演示

二、课堂练习

三、指针的使用细节

 

一、案例演示

要求:

①写一个程序,获取一个 int 变量 num 的地址,并显示到终端

②将 num 的地址赋值给指针 ptr,并通过 ptr 去修改 num 的值

(1)程序代码

第①题

package main

import "fmt"

func main() {

var num int = 9

fmt.Printf("num address=%v",&num)

}

输出结果:

num address= 0xc04204e080

第②题

package main

import "fmt"

func main() {

var num int = 9

//对num赋值为9

fmt.Printf("num address=%v\n",&num)

var ptr *int

ptr = &num

//将num的地址赋值给指针 ptr

*ptr = 10

//给ptr重新赋值,这里改变时,会改变num的值

fmt.Println("num =",num)

}

输出结果:

num address= 0xc042010098

num = 10

(2)指针内存布局示意图

image.png

以上示意图执行到 ptr = &num,接下来“*ptr = 10”中的“ptr”取 num 变量的地址,“*”表示取 num 的值,“= 10”则将 num 的值由9修改为10,故最终输出值为10。

 

二、课堂练习

(1)第一题

func main() {

var a int = 300

var ptr *int = a

}

解析:

var ptr *int = a  错误,a 是一个值,而 ptr 是一个指针变量,将值交给指针变量,是错误的,应改为 var ptr *int = &a。

(2)第二题

func main() {

var a int = 300

var ptr *float = &a

}

解析:

var ptr *float = &a  错误,将地址交给指针时也要求类型一致,a 是 int 变量,而指针 ptr 指向的是 float32,将 int型变量 a 的地址交给 float32型指针,指向 float32的指针变量接收地址必须是 float32型变量的地址。

(3)第三题

func main() {

var a int = 300

var b int = 400

var ptr *int =&a

*ptr = 100

ptr = &b

*ptr = 200

fmt.Printf("a=%d,b=%d,*ptr=%d",a,b,*ptr)

}

Q:该代码输出什么内容?  

解析:var a int = 300表示将300赋值给 a

var b int = 400表示将400赋值给 b

var ptr *int =&a 表示将 int 型变量 a 的地址交给指向 int 的指针 ptr

*ptr = 100表示取指针 ptr 的地址,并将该地址下存储的值改为100,即将 a 的值改为了100

ptr = &b 表示将 int 型变量 b 的地址交给 ptr,此时指针 ptr 改为指向 in t型变量 b 的地址

*ptr = 200表示取指针 ptr 的地址,并将该地址下存储的值改为200,即将 b 的值改为了200,a 不变

fmt.Printf("a=%d,b=%d,*ptr=%d",a,b,*ptr)表示分别输出 a、b 以及 ptr 所指向的变量 b 的值

因此,最终的输出结果为 a = 100,b = 200,*ptr = 200。


三、指针的使用细节

(1)值类型

所有的值类型都有对应的指针类型,形式为*数据类型。

如 int 对应的指针类型为*int,float32对应的指针类型解释*float32,float64对应的指针类型解释*float64。

(2)值类型分类

基本数据类型 int 系列、floa t系列、bool、string、数组和结构体 struct(后面会讲到)

相关文章
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
196 3
|
C++
C++语言学习指针和引用应用案例
C++语言学习指针和引用应用案例
119 1
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
存储 C++
c++学习笔记06 指针
C++指针的详细学习笔记06,涵盖了指针的定义、使用、内存占用、空指针和野指针的概念,以及指针与数组、函数的关系和使用技巧。
94 0
C++学习笔记_07 const、指针、引用 2021-04-19
C++学习笔记_07 const、指针、引用 2021-04-19
138 0
|
存储 人工智能 算法
c++算法学习笔记 (9) 双指针
c++算法学习笔记 (9) 双指针
|
编译器 vr&ar C语言
C primer plus 学习笔记 第10章 数组和指针
C primer plus 学习笔记 第10章 数组和指针
|
存储 C++
C++语言学习指针和引用应用案例
C++中的指针和引用用于高效操作内存。示例展示指针和引用的基本用法:指针`*p`存储变量`a`的地址,引用`&x`在函数调用中实现值交换而无需复制。此外,引用`update(&x)`可直接修改原变量,指针`p`在数组操作中用于遍历和访问不同部分。
116 2
|
存储 Rust JavaScript
Rust学习笔记之智能指针
何为指针 推荐阅读指数 ⭐️⭐️⭐️⭐️⭐️ 使用 Box<T> 指向堆上的数据 推荐阅读指数 ⭐️⭐️⭐️⭐️ 使用 Drop Trait 运行清理代码 推荐阅读指数 ⭐️⭐️⭐️⭐️ Rc<T> 引用计数智能指针 推荐阅读指数 ⭐️⭐️⭐️⭐️ RefCell<T> 和内部可变性模式 推荐阅读指数 ⭐️⭐️⭐️⭐️
335 1
Rust学习笔记之智能指针
|
C语言
【C语言】规范掌握C语言函数|数组名的妙用|指针快速入门|综合使用小案例
【C语言】规范掌握C语言函数|数组名的妙用|指针快速入门|综合使用小案例
116 0