go之变量、指针、引用地址

一、值类型

  • 定义和说明
定义:变量直接指向存在内存中的值,我们称之为值类型。

值类型的变量的值存储在栈中。
值类型 将一个变量赋值给另一个变量 被称为值拷贝
  • 实例
package main

import "fmt"

func main(){
    var num1,num2 int
    num1 = 10
    num2 = num1 // 值类型赋值操作

    fmt.Println(num1,num2) // 10 10

    num1 = 20
    fmt.Println(num1,num2) // 20 10
}

二、指针类型

  • 定义
一个变量指向内存中值所在的内存地址,我们称这个变量为指针类型

go 语言中的指针与C/C++ 中的指针用法是一样的,只是出于安全性的考虑go增加了:
    1、不同类型的指针不能互相转化
    2、任何普通指针类型*T和uintptr之间不能互相转化
    3、指针变量不能进行运算
  • 实例
package main

import "fmt"

func main(){
    var num int = 100
    var ptr *int  // 类型前 加 * 表示这是指针类型,指针类型的初始值为nil ,和其他语言的NUll,None一样
        ptr = &num // & 取num 变量的内存地址。 因为ptr 是指针,指向的是内存地址,所以需要赋值操作的是内存地址
        fmt.Println("ptr 指针的值:",ptr)
        fmt.Println("*ptr 指针的值:",*ptr) // * 取指针内存地址所指向的值

        num = 200
        fmt.Println("*ptr 指针的值:",*ptr)

}
结果:
ptr 指针的值: 0xc000048080
*ptr 指针的值: 100
*ptr 指针的值: 200
  • *ptr 没有操作,为什么值发生了变化
ptr 是指针类型,并被赋予了 num 的内存地址,当num值发现变化时,实际也就是 ptr 内存地址所对应的值变了
因为 ptr内存地址所对应的 内存值就是num的值

三、值与内存地址与指针

1、变量是抽象出来的概念,go语言程序运行时即表示内存值
2、内存地址即 内存值所在的内存空间的编号
3、指针变量:是一种占位符,用于引用计算机的内存地址。可理解为内存地址的标签

四、取地址与解引用

  • 说明
在go语言中我们可以通过
    & 是取地址符号 , 即取得某个变量的地址 , 如 ; &a
    * 是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 , 也就是这个地址所存储的值
  • 运用
package main

import "fmt"

func main(){
    var n1,n2,n3 int
    n1 = 100
    n2 = 200
    n3 = 3
    swap(&n1,&n2) // 传内存地址
    add(&n3) // 取内存地址
    fmt.Println(n1)  // 200
    fmt.Println(n2) // 100
    fmt.Println(n3) // 4

    var num *int  // 申明一个int 指针类型
    num = &n3  // 所以可以赋值 内存地址
    add(num)
    fmt.Println("num指针变量的内存值:",*num) // *num == 5
    // 此时n3 == 5
}

// 传入 两个指针类型的数据.
func swap(i,j *int){
    *i,*j = *j,*i // 值的替换
}

func add(num *int){
    // *num 解引用
    *num = *num + 1
}

五、引用类型

在go语言中目前引用类型有: 切片、map、chan、func
引用类型可以简单的理解为指针
这个后面会介绍

原文地址:https://www.cnblogs.com/xiaobaiskill/p/10624202.html

时间: 2024-12-17 05:02:17

go之变量、指针、引用地址的相关文章

C++ 指针 引用 变量引用

变量引用: 引用的作用就是给变量起个别名,假如有一个变量a,想给它起个别名b,         可以这么写:int a;//定义a是整型变量.int &b=a;//声明b是a的引用. 上面就是b是a的引用,即b是a的别名.在上面“&”是引用声明符,并不代表地址.a和b占同一个地址空间和内存单元.声明b是a的引用,可以理解为:使变量b具有变量a的地址. 引用作为函数参数: C++之所以增加引用机制,主要是把它作为函数参数,以扩充函数传递数据的功能. 函数参数传递的两种情况: 1.将变量名作为

(4)风色从零单排《C++ Primer》 变量,引用,指针

从零单排<C++ Primer> --(4)变量,引用,指针   变量的初始化 所谓变量的初始化,指在创建变量的同时给予值. 初始化方法: int units_sold = 0; int units_sold = {0}; int units_sold{0}; int units_sold{0}; long double ld = 3.1415926536: int a{ld}, b = {ld}; //error:narrowing conversion required int c(ld)

利用指针访问地址篡改变量的值

#include <stdio.h> #include <stdlib.h> int main(void) { int i = 10; int *p = &i; printf("i = %d\n",i); printf("i的地址 = %d\n",p); /* 2686776是变量i的地址, int*是强制转换2686776为指针类型,相当于指针p, *(int*)2686776,(int*)相当于找到了变量i的地址, *(int*)

Little-endian的一个好处:在变量指针转换的时候地址保持不变

Big-endian 的内存顺序和数字的书写顺序是一致的,方便阅读理解.Little-endian 在变量指针转换的时候地址保持不变,比如 int64* 转到 int32* 各有利弊,统一就好,目前看来是 little-endian成为主流了. ------------------------------------------------------------------------- 因为现在基本上遇不到PowerPC的服务器,所以我曾经比较变态的让通讯协议里全使用小端格式,然后用指针强制

承诺c指针 (1)指针是地址

(1)是地址 首先明白一个观点:指针就是地址.这是理解指针的起始一步. 直观感受下.变量的地址 int main() { int foo; int *foo_p; foo = 5; foo_p = &foo; printf(" foo...%d\n", foo); printf("*foo_p...%d\n", *foo_p); printf(" &foo...%p\n", &foo); printf(" foo

浅谈运用指针引用字符串

一.字符串的引用方式 1.如果字符串存放在字符数组中可以用数组名和下标引用 char string[10] = "Hello word"; printf("%s",string); 2.用字符指针变量指向字符串常量,用字符指针引用字符串 char *strp = "Hello word"; printf("%s",strp); //系统将字符串常量以字符数组形式保存在内存中,字符串末尾系统自动加了一个'\0'.再将字符数组的首

浅谈变量,数据变量与引用变量

Java是一种面向对象语言 Java程序中一切皆对象,也就是说运行中的Java程序其实是很多对象依照设计要求不断 创建 修改 联系其他对象 修改其他对象 完成使命后被垃圾收集器回收. 那么程序设计就要求定义对象的功能,设置对象之间的联系(接口),设计对象之间相互操作的顺序,根据操作结果的不同再进行更多不同的操作. 对象的定义指对对象的准确描述(对象有什么属性特点,具备什么能力-方法),定义对象的文件我们称之为类,所以类可以有属性和方法: (其实对象是非常非常非常抽象的,它的抽象体现在 1.范围广

c语言指针,简单一句话指针就是地址

简单一句话,指针就是地址 0:网购的地址,通过这个地址找到你, 程序的地址,通过地址来操作变量,这个地址有一个叫法叫做指针,java 里面把地址就叫做引用 1:内存的单位是字节,例如一个256MB的机器,有256*1024*1024 字节的存储单位,每个字节都有一个对应的地址 通过该地址可以找到该块内存,就像我们的通讯地址一样 2:每一个变量由若干个字节组成,例如:int age = 20 由 4个字节组成,变量中第一个字节的地址称为变量的地址 #include <stdio.h> int m

(一)指针就是地址

首先明确一个观点:指针就是地址.这是理解指针的起始一步. 直观感受下,变量的地址 1 int main() 2 { 3 int foo; 4 int *foo_p; 5 foo = 5; 6 foo_p = &foo; 7 printf(" foo...%d\n", foo); 8 printf("*foo_p...%d\n", *foo_p); 9 printf(" &foo...%p\n", &foo); 10 pri