go语言指针和C指针区别,golang指针与C指针的异同

总结一下golang中的指针与C语言的指针的用法。

总体一致: C的代码:

int *number;

number = (int *) malloc(sizeof(int));

*number = 3;

printf("%d\n", *number); golang的代码:

var pointer *int;

pointer = new(int);

*pointer = 3;

fmt.Println(*pointer);

多重指针情况:

C的代码:

int **outer;

int *inter;

inter = (int *) malloc(sizeof(int));

*inter = 3;

outer = &inter;

//地址一样

printf("%p\n", inter);

printf("%p\n", *outer);

//值一样

printf("%d\n", *inter);

printf("%d\n", **outer);

golang的代码:

var outer **int;

var inter *int;

inter = new(int);

*inter = 3;

outer = &inter;

//地址一样

fmt.Println(inter);

fmt.Println(*outer);

//值一样

fmt.Println(*inter);

fmt.Println(**outer);

C语言的下面这种方式在golang里实现:

int **outer;

int *inter;

inter = (int *) malloc(sizeof(int));

outer = (int **) malloc(sizeof(int));

*inter = 3;

*outer = inter;

//地址一样

printf("%p\n", inter);

printf("%p\n", *outer);

//值一样

printf("%d\n", *inter);

printf("%d\n", **outer); 在golang中:

var inter *int;

var outer **int;

inter = new(int);

*inter = 3;

outer = new(*int);

*outer = inter;

//地址一样

fmt.Println(inter);

fmt.Println(*outer);

//值一样

fmt.Println(*inter);

fmt.Println(**outer);

上面都是在玩指针, 下面看看基本的数据结构.

基本的数据结构有: 数组与结构体 (map和树之类的不在討論范围)

golang中的数组与C中的数组有很大的差别

golang中的数组是这样说的: Arrays are values, not implicit pointers as in C.

0. 数组做参数时, 需要被检查长度.

1.

变量名不等于数组开始指针!

2. 不支持C中的*(ar + sizeof(int))方式的指针移动. 需要使用到unsafe包

3. 如果p2array为指向数组的指针, *p2array不等于p2array[0] 例子0   数组做参数时, 需要被检查长度.

func use_array( args [4]int ){

args[1] = 100;

}

func main() {

var args = [5]int{1, 2, 3, 4, 5};

use_array(args);

fmt.Println(args);

}

编译出错: cannot use args (type [5]int) as type [4]int in function argument, 需要有长度上的检查

例子1   变量名不等于数组开始指针!

func use_array( args [4]int ){

args[1] = 100;

}

func main() {

var args = [5]int{1, 2, 3, 4, 5};

use_array(args);

fmt.Println(args);

}

输出結果是 [1 2 3 4], 没有保存結果, 数组名的用法与C的不一样. 在golang里是这样的:

// 又长度检查, 也为地址传参

func use_array( args *[4]int ){

args[1] = 100; //但是使用还是和C一致, 不需要别加"*"操作符

}

func main() {

var args = [4]int{1, 2, 3, 4};

use_array(&args); //数组名已经不是表示地址了, 需要使用"&"得到地址

fmt.Println(args);

}

例子2   如果p2array为指向数组的指针, *p2array不等于p2array[0] 对比一下C和golang在这方面的差别:

void main(int argc, char *argv[]){

int *p2array;

p2array = (int *) malloc(sizeof(int) * 3);

//等于p2array[0]

*p2array = 0;

printf("%d\n", *p2array + 1);

}

* 输出为1

func main() {

var p2array *[3]int ;

p2array = new([3]int);

fmt.Printf("%x\n", *p2array + 1); //不管p2array是指针变量还是数组变量, 都只能使用"[]"方式使用

}

* 报错.

golang中的结构体也与C中的有差别

下面的方式是相当一致的:

C版本的:

typedef struct

{

int x;

int y;

} Point;

Point p;

p.x = 10;

p.y = 20;

//开始地址

printf("%p\n", &p);

//某元素地址

printf("%p\n", &(p.x));

golang版本的:

type Point struct{

x int;

y int;

};

var p Point;

p.x = 10;

p.y = 20;

fmt.Printf("%p\n", &p);

fmt.Printf("%p\n", &(p.x));

使用allocate的方式:

C代码:

typedef struct

{

int x;

int y;

} Point;

Point *p;

p = (Point *) malloc(sizeof(Point));

p->x = 10;

p->y = 20;

//开始地址

printf("%p\n", p); //地址

//某元素地址

printf("%p\n", &(p->x)); golang代码:

type Point struct{

x int;

y int;

};

var p *Point;

p = new(Point);

p.x = 10;

p.y = 20;

fmt.Printf("%p\n", p); //地址

fmt.Printf("%p\n", &(p.x));

也可以说是一样的, 只不过在使用结构中的元素时没有了"->"操作符:

There is no -> notation for structure pointers. Go provides the indirection for you.

结构体的地址传参与数组的方式一样, 当然, 和C的风格也是一模一样的. 如下例子:

C代码:

#include

#include

typedef struct

{

int x;

int y;

} Point;

void use_struct(Point *arg){

arg->x = 100;

}

void main(int argc, char *argv[]){

Point *p;

p = (Point *) malloc(sizeof(Point));

p->x = 10;

p->y = 20;

use_struct(p);

printf("%d\n", p->x);

} golang代码:

import "fmt"

type Point struct{

x int;

y int;

};

func use_sturct( p *Point ){

p.x = 100;

}

func main() {

var p *Point;

p = new(Point);

p.x = 10;

p.y = 20;

use_sturct(p);

fmt.Printf("%d\n", p.x);

}

总的来说......

在传参方面, 大体上看与C的相同:

f(ar); // passes a copy of ar

fp(&ar); // passes a pointer to ar * 只是变量名是不是表示首个地址 有区别

"&" 与C语言一样是得到变量的指针. 与C有点不同, 取golang中指针指针的内容的值是不需要使用"*"操作符的, 但是指针的指针(或者继续多层时)需要显式使用"*"符号.

http://golang.org/doc/go_spec.html#Selectors 一节中有描述。

* 三层以上的指针使用是比较少的. 两层还是常见, 如main函数的参数char * argv[]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Golang 中,可以使用指针来操作 map。当我们传递 map 作为参数时,实际上是传递了 map 的一个副本。如果需要修改原始 map,可以传递 map 的指针,或者在函数内部返回 map 的指针。 以下是一个使用 map 指针的示例代码: ```go package main import "fmt" func main() { m := make(map[string]int) m["a"] = 1 m["b"] = 2 // 传递 map 的指针 addValue(&m, "c", 3) fmt.Println(m) // 输出:map[a:1 b:2 c:3] // 返回 map 的指针 m2 := createMap() fmt.Println(m2) // 输出:map[x:10 y:20 z:30] } func addValue(m *map[string]int, key string, value int) { (*m)[key] = value } func createMap() *map[string]int { m := make(map[string]int) m["x"] = 10 m["y"] = 20 m["z"] = 30 return &m } ``` 在上面的示例中,我们定义了两个函数,`addValue` 和 `createMap`,分别演示了如何传递 map 的指针和返回 map 的指针。在 `addValue` 函数中,我们使用 `*` 操作符来获取 map 的指针,并修改了原始的 map。在 `createMap` 函数中,我们使用 `&` 操作符来返回 map 的指针。 ### 回答2: 在Go语言中,map是一种无序的键值对集合,可以用于存储和检索数据。默认情况下,map是通过值传递的,即将map赋值给另一个变量时,会复制一份map的副本。但我们也可以使用指针来操作map,从而可以在函数间共享和修改同一个map。 使用指针来操作map有两种常见的方式。一种是直接声明一个指向map的指针变量,然后通过间接引用来操作map。例如: ```go var m *map[string]int // 声明指向map的指针变量 m = &map[string]int{} // 创建一个空的map,并将其地址赋值给指针变量 (*m)["key"] = 123 // 通过指针间接引用map,并修改其值 ``` 另一种方式是使用make函数创建一个map,并将其指针传递给函数。例如: ```go func modifyMap(m *map[string]int) { (*m)["key"] = 123 // 通过指针间接引用map,并修改其值 } func main() { m := make(map[string]int) // 创建一个map modifyMap(&m) // 将map的指针传递给函数 } ``` 需要注意的是,在使用指针操作map时,要确保map已经被初始化。否则,会发生运行时错误。另外,由于map本身就是引用类型,因此大部分情况下,直接使用map而不是指针就可以满足需求,而且更加简单和安全。只有在需要在函数间传递和修改同一个map时,才需要使用指针来操作map。 ### 回答3: Golang中的map是一种无序的键值对集合,而map指针则是指向map的内存地址的指针。 在使用map时,可以通过var关键字声明一个map变量,并使用make函数来初始化该map。而如果需要使用map指针,可以通过将map变量的地址赋值给指针变量来实现。 下面是一个示例代码: ``` package main import "fmt" func main() { // 声明并初始化map myMap := make(map[string]int) myMap["apple"] = 2 myMap["banana"] = 3 // 声明并初始化map指针 var myMapPtr *map[string]int myMapPtr = &myMap // 使用map指针修改map (*myMapPtr)["apple"] = 5 // 输出修改后的值 fmt.Println(myMap["apple"]) } ``` 在上述代码中,首先使用make函数初始化了一个map变量myMap,并给其中的键"apple"和"banana"分别赋值。然后,使用var关键字声明了一个map指针myMapPtr,并将myMymap的地址赋值给了myMapPtr。接下来,使用map指针修改了map中键"apple"的值为5。最后,输出了map中键"apple"的值,结果为5。 总结来说,Golang的map指针允许我们通过指针来修改和访问map的值,更灵活地操作Map的数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值