Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了golang指针与C指针的异同大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

总体一致:

@H_502_8@C的代码:
?
1
2
3
4
int *number;
number = ( *) @H_9_41@malloc ( sizeof ( ));
*number = 3;
printf ( "%d\n" ,*number);
@H_502_8@golang的代码:
var pointer * ;
pointer = new );
*pointer = 3;
fmt.Println(*pointer);

多重指针情况:

C的代码:

4
5
6
7
8
9
10
11
12
13
**outer;
*inter;
inter = ( ));
*inter = 3;
outer = &inter;
//地址一样
"%p\n" );
);
//值一样
);
**outer);


@H_502_8@

11
var outer **
var inter * ;
inter = );
*inter = 3;
outer = &inter;
//地址一样
fmt.Println(inter);
fmt.Println(*outer);
//值一样
fmt.Println(*inter);
fmt.Println(**outer);


@H_502_8@C语言的下面这种方式在golang里实现:
**outer;
*inter;
));
outer = ( **) ));
*inter = 3;
*outer = inter;
//地址一样
);
:rgb(64,*outer);
//值一样
:rgb(64,*inter);
:rgb(64,**outer);
@H_502_8@在golang中:
12
;
;
);
*inter = 3;
outer = (* );
*outer = inter;
//地址一样
fmt.Println(inter);
fmt.Println(*outer);
//值一样
fmt.Println(*inter);
上面都是在玩指针,下面看看基本的数据结构. @H_502_8@
基本的数据结构有: 数组与结构体 (map和树之类的不在討論范围)
golang中的数组与C中的数组有很大的差别
golang中的数组是这样说的: Arrays are values,not implicit pointers as in C.
0. 数组做参数时,需要被检查长度.
1. 变量名不等于数组开始指针!
@H_502_8@

2. 不支持C中的*(ar + sizeof(int))方式的指针移动. 需要使用到unsafe包
3. 如果p2array为指向数组的指针, *p2array不等于p2array[0]

@H_502_8@例子0 数组做参数时,宋体; font-size:13px; line-height:22.5px">
9
func use_array( args [4]
){
args[1] = 100;
}
func main() {
var args = [5] {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 变量名不等于数组开始指针!

输出結果是 [1 2 3 4],没有保存結果,数组名的用法与C的不一样. 在golang里是这样的:
10
// 又长度检查,也为地址传参
func use_array( args *[4] ){
args[1] = 100; //但是使用还是和C一致,不需要别加"*"操作符
}
func main() {
var args = [4] use_array(&args); //数组名已经不是表示地址了,需要使用"&"得到地址
fmt.Println(args);
@H_263_489@ 例子2 如果p2array为指向数组的指针, *p2array不等于p2array[0]

@H_502_8@对比一下C和golang在这方面的差别:

8
void main( argc, char *argv[]){
*p2array;
p2array = ( ) * 3);
//等于p2array[0]
*p2array = 0;
:rgb(64,*p2array + 1);
}
* 输出为1
6
func main() {
var p2array *[3] ;
p2array = ([3] fmt.Printf( "%x\n" ); //不管p2array是指针变量还是数组变量,都只能使用"[]"方式使用
}
* 报错.

golang中的结构体也与C中的有差别
下面的方式是相当一致的:
C版本的:

13
14
15
typedef struct
{
x;
y;
} Point;
Point p;
p.x = 10;
p.y = 20;
//开始地址
:rgb(64,&p);
//某元素地址
:rgb(64,&(p.X));

golang版本的:

type Point
struct {
x y ;
};
var p Point;
p.x = 10;
p.y = 20;
:rgb(64,&p);
:rgb(64,&(p.X));

使用allocate的方式: @H_502_8@C代码:
15
16
Point *p;
p = (Point *) (Point));
p->x = 10;
p->y = 20;
//开始地址
:rgb(64,p); //地址
//某元素地址
:rgb(64,&(p->X));
@H_502_8@golang代码:
var p *Point;
p = (Point);
p.x = 10;
p.y = 20;
//地址
也可以说是一样的,只不过在使用结构中的元素时没有了"->"操作符:

1
There is no -> notation for structure pointers. Go provides the indirection for you.
@H_502_8@结构体的地址传参与数组的方式一样,当然,和C的风格也是一模一样的. 如下例子:
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdlib.h>
struct
{
x;
y;
} Point;
use_struct(Point *arg){
arg->x = 100;
}
*argv[]){
Point *p;
(Point));
p->x = 10;
p->y = 20;
use_struct(p);
:rgb(64,p->X);
}
@H_502_8@
24
import "fmt"
;
;
};
func use_sturct( p *Point ){
p.x = 100;
}
func main() {
var p *Point;
(Point);
p.x = 10;
p.y = 20;
use_sturct(p);
:rgb(64,p.X);
}
总的来说...... 在传参方面,大体上看与C的相同: @H_502_8@
2
f(ar); // passes a copy of ar
fp(&ar); // passes a pointer to ar
@H_502_8@* 只是变量名是不是表示首个地址 有区别
"&" 与C语言一样是得到变量的指针. 与C有点不同, 取golang中指针指针的内容的值是不需要使用"*"操作符的, 但是指针的指针(或者继续多层时)需要显式使用"*"符号. @H_502_8@在 http://golang.org/doc/go_spec.html#Selectors @H_502_8@一节中有描述。
* 三层以上的指针使用是比较少的. 两层还是常见,如main函数的参数char * argv[]
本图文内容来源于网友网络收集整理提供,作为学习参使用,版权属于原作者。
大佬教程官方1群(满)
大佬教程官方2群(满)
大佬教程官方3群
大佬教程官方4群
@H_121_1058@
@H_121_1058@

猜你在找的Go相关文章

方法和接收者 Go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的概念就类似于其他语言中的this或者 self。 Go 语言中同时
函数是组织好的、可重复使用的、用于执行指定任务的代码块。 Go语言中支持函数、匿名函数和闭包,并且函数在Go语言中属于“一等公民”。 函数定义 Go语言中定义函数使用func关键字,具体格式如下: f
面向对象的三大特征: 封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式 继承:使得子类具有父类的属性和方法或者重新定义、追加属性和方法等 多态:不同对象中同种行为的不同实现方式 Go并不是一个纯
在工程化的开发项目中,Go语言的源码复用是建立在包(package)基础之上的。 包(package)是多个Go源码的集合,是一种高级的代码复用方案,Go语言提供了很多内置包,如fmt、os、io等。
为什么要学 Go 性能优越感;Go 极其地快,其性能与 Java 或 C++相似。在使用中,Go 一般比 Python 要快 30 倍; 序列化/去序列化、排序和聚合中表现优异; 开发者效率较高;多种
什么是反射 官方关于反射定义: Reflection in compuTing is the ability of a program to examine its own structure, pa
因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性。 func arraySum(x [3]int) int{ sum := 0 for _, v := range x{ su
@L_616_44@
接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。 接口类型 在Go语言中接口(interface)是一种类型,一种抽象的类型。 interface是
@H_121_1058@
@H_121_1058@
@H_121_1058@

golang指针与C指针的异同

微信公众号搜 "程序精选"关注
@H_121_1058@
@H_121_1058@
@H_121_1058@

大佬总结

以上是大佬教程为你收集整理的golang指针与C指针的异同全部内容,希望文章能够帮你解决golang指针与C指针的异同所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:cgolang异同指针
猜你在找的Go相关文章
其他相关热搜词更多
phpJavaPython程序员load如何string使用参数jquery开发安装listlinuxiosandroid工具javascriptcap