8. Go语言—指针类型

一、指针类型介绍

  • 普通类型,变量存的就是值,也叫值类型。
  • 获取变量的地址,用&,比如:var a int ,获取a的地址:&a
  • 指针类型,变量存的是一个地址,这个地址存的才是值(指针存储的是一个地址)
  • 获取指针类型所指向的值,使用:,比如,var p int,使用 *p 获取p指向的值

    var a int = 5 5

    var p * int = &a 0xefefefef --> 5

二、指针的使用

1. 实际用法

package main
import (
    "fmt"
)
func main() {
    var cat int = 1
    var str string = "banana"
    // 使用 fmt.Printf 的动词%p输出 cat 和 str 变量取地址后的指针值
    fmt.Printf("%p %p", &cat, &str)
}
运行结果:
0xc042052088 0xc0420461b0

2. 从指针获取指针指向的值

? 在对普通变量使用&操作符取地址获得这个变量的指针后,可以对指针使用*操作,也就是指针取值

package main

import (
    "fmt"
)

func main() {

    // 准备一个字符串类型
    var house = "Malibu Point 10880, 90265"

    // 对字符串取地址, ptr类型为*string
    ptr := &house

    // 打印ptr的类型
    fmt.Printf("ptr type: %T\n", ptr)

    // 打印ptr的指针地址
    fmt.Printf("address: %p\n", ptr)

    // 对指针进行取值操作
    value := *ptr

    // 取值后的类型
    fmt.Printf("value type: %T\n", value)

    // 指针取值后就是指向变量的值
    fmt.Printf("value: %s\n", value)

}

运行结果:
ptr type: *string
address: 0xc0420401b0
value type: string
value: Malibu Point 10880, 90265

取地址操作符&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值。
变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:
对变量进行取地址(&)操作,可以获得这个变量的指针变量。
指针变量的值是指针地址。
对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值。

3. 使用指针修改值

package main
import "fmt"
// 交换函数
func swap(a, b *int) {
    // 取a指针的值, 赋给临时变量t
    t := *a
    // 取b指针的值, 赋给a指针指向的变量
    *a = *b
    // 将a指针的值赋给b指针指向的变量
    *b = t
}
func main() {
// 准备两个变量, 赋值1和2
    x, y := 1, 2
    // 交换变量值
    swap(&x, &y)
    // 输出变量值
    fmt.Println(x, y)
}

运行结果:
2 1

代码说明如下:
第 6 行,定义一个交换函数,参数为 a、b,类型都为 *int,都是指针类型。
第 9 行,将 a 指针取值,把值(int类型)赋给 t 变量,t 此时也是 int 类型。
第 12 行,取 b 指针值,赋给 a 变量指向的变量。注意,此时*a的意思不是取 a 指针的值,而是“a指向的变量”。
第 15 行,将 t 的值赋给 b 指向的变量。
第 21 行,准备 x、y 两个变量,赋值 1 和 2,类型为 int。
第 24 行,取出 x 和 y 的地址作为参数传给 swap() 函数进行调用。
第 27 行,交换完毕时,输出 x 和 y 的值。

*操作符作为右值时,意义是取指针的值;作为左值时,也就是放在赋值操作符的左边时,表示 a 指向的变量。其实归纳起来,*操作符的根本意义就是操作指针指向的变量。当操作在右值时,就是取指向变量的值;当操作在左值时,就是将值设置给指向的变量。

? 如果在 swap() 函数中交换操作的是指针值

package main
import "fmt"
func swap(a, b *int) {
    b, a = a, b
}
func main() {
    x, y := 1, 2
    swap(&x, &y)
    fmt.Println(x, y)
}

运行结果:
1 2
结果表明,交换是不成功的。上面代码中的 swap() 函数交换的是 a 和 b 的地址,在交换完毕后,a 和 b 的变量值确实被交换。但和 a、b 关联的两个变量并没有实际关联。这就像写有两座房子的卡片放在桌上一字摊开,交换两座房子的卡片后并不会对两座房子有任何影响。

三、创建指针另一方法

1. 语法格式
    new(类型)

2. 实例
    str := new(string)
    *str = "ninja"
    fmt.Println(*str)

3. 注解
    new() 函数可以创建一个对应类型的指针,创建过程会分配内存。被创建的指针指向的值为默认值

原文地址:https://www.cnblogs.com/hq82/p/11073575.html

时间: 2024-11-06 09:33:12

8. Go语言—指针类型的相关文章

C语言指针类型

1:只要是指针类型,不管是几级指针[带几个*],其宽度都是4字节 2:任何数据类型[包括自己定义的结构体]前面都能加*号,表示该数据类型的一个指针 3:由于是386处理器,其数据处理的宽度都是四个字节的,所以内存的对其方式都是以四个字节为单位对其的,只是在对具体数据进行操作的时候按照具体数据类型的长度来进行操作 4:指针类型的赋值必须是完整的赋值方式,不能简写,[赋值号两端的数据类型要完全一致,即*的数量要完全一致] 5:指针类型的数据只能做加或者是减运算,其在进行自加或者自减运算时,加的是该数

Swift中对C语言接口缓存的使用以及数组、字符串转为指针类型的方法

由于Swift编程语言属于上层编程语言,而Swift中由于为了低层的高性能计算接口,所以往往需要C语言中的指针类型,由此,在Swift编程语言刚诞生的时候就有了UnsafePointer与UnsafeMutablePointer类型,分别对应为const Type*类型与Type *类型. 而在Swift编程语言中,由于一般数组(Array)对象都无法直接用于C语言中含有指针类型的函数参数(比如:void*),所以往往需要将数组转为指针类型,此外也需要将数组中元素内容存放到连续的存储空间.此外,

黑马程序员-C语言基础:指针类型与指针和数组、字符串的关系

//指针变量就是用来存储地址的,只能存储地址 格式:  int  *p;  这个p为指针变量:指针变量占8个字节 类型是用来说明这个指针指向的类型: 比如上边的int代表这个指针变量会指向int类型的存储空间: int *p = &a;//这样一句可以写,此时的*只是一个标志,表示这个*只是表示p是个指针: *p = &a;//这样写就错了:此时*p表示取p指向的空间的值: 指针疑问:指针既然都占据8个字节,那么为什么要划分类型, 是因为当用*p指针取值或者赋值的时候,知道该取几个字节,比

C语言 详解多级指针与指针类型的关系

//通常意义上,指针类型指的是‘指针值’的类型,而不是‘指针’的类型 //V推论①:变量的步长只与变量的类型有关 //普通变量名是一段内存空间的标识,普通变量名代表的是一段内存空间, //对于复杂变量(例如指针):通常的指针的步长准确来说是指‘指针值’的步长,而不是指‘指针本身’的步长,指针本身的步长永远是4, //我们通常说的指针类型往往指的是‘指针值’的类型,,而不是‘指针’的类型 //而指针类型就是一个占4个字节大小内存空间的一种类型(从来没有人定义过指针类型,人们定义的都是‘指针值’的类

C语言 数组类型与数组指针类型

//数组类型与数组指针类型 #include<stdio.h> #include<stdlib.h> #include<string.h> void main(){ printf("\n-------数组类型----------\n"); { //定义一个数组类型 typedef int Myarr[5];//定义了一个int型有5个元素的数组类型 //定义一个数组类型变量 Myarr myarr; //数组赋值 int i = 0; for (i

对于C语言复杂指针类型的分析

转载自:http://www.slyar.com/blog/complicated-point-type.html int p; p是一个普通的整型变量. int *p; 1.p与*结合,说明p是一个指针.2.*p与int结合,说明指针所指向的内容的类型是整型的. 所以p是一个返回整型数据的指针. int p[5]; 1.p与[]结合,说明p是一个数组.2.p[5]与int结合,说明数组里的元素是整型的. 所以p是一个由整型数据组成的数组. int *p[5]; 1.p与[]结合(因为其优先级比

C语言指针

C语言指针 指针是什么? 指针也是一个变量,但是这个变量存储的是一个地址,指向一个存储单元.我们可以根据指针(地址)找到他所指的变量,并对这个变量进行操作(赋值等).通过C里面的取地址符号&和取所指内容的符号*可以很方便的表示指针以及指针所指的变量之间的关系 /* ============================================================================ Name C语言指针 : text.c Author : Version : C

11-C语言指针

一. 指针前奏 1. 指针的重要性 指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言. 2. 小需求 l void change(int  n)函数调用完毕后,改变实参的值 l 分析:修改实参的值->找到存储空间->地址 二. 指针变量的定义 1. 定义的格式 l 类名标识符 *指针变量名; l int *p; 2. 先定义后赋值 l 简单取值 int a = 10; int *p; p = &a; printf("%d&q

void及void指针类型

1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并 详述void及void指针类型的使用方法与技巧. 2.void的含义 void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据. void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义: void a; 这行语句编译时会出错,提示“illegal use of ty