飞道的博客

Golang指针和C++指针的简单剖析

337人阅读  评论(0)

目录

 

前言

正文

什么是指针?

指针怎么用?

明显差异

结论


前言

不止C++有指针,Golang也有指针呦!二者有哪些区别呢?今天就来看一看。

正文

什么是指针?

指针是用来指向任何一个变量的内存地址的类型变量,它所指向的变量的内存地址在 32 和 64 位机器上分别占用 4 或者 8 个字节,占用字节的大小与所指向的值的大小无关。

Golang

下面我们通过一个例子,来了解在Golang语言中是如何获取变量的地址的。

实例代码:


  
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. var a int = 1 // 一个整型变量a
  7. var b string = "abcdefg" // 一个字符串变量b
  8. fmt.Printf( "%p %p", &a, &b) // 分别输出a和b的地址
  9. }

上述代码的运行结果:

0xc00007e020 0xc00005e1e0

值得注意的是,Golang中在声明变量时,是可以使用汉字的(这一点确实比C++要秀)。

比如,下面的编码形式也是可以编译通过并且正确运行的,习惯了C++开发的朋友要是看到,肯定强迫症都要犯了。。。“我的意大利炮呢?”


  
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. var 一个整型变量 int = 1
  7. var 一个字符串变量 string = "abcdefg"
  8. fmt.Printf( "%p %p", &一个整型变量, &一个字符串变量)
  9. }

上述代码的运行结果:

0xc000016060 0xc000010210 

C++

下面我们通过一个例子来了解C++语言中是如何获取变量的地址的。

实例代码:


  
  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4. int a = 1; // 一个整型变量a
  5. string b = "abcdefg"; // 一个字符串变量b
  6. cout<< &a << " "<< &b << endl; // 分别输出a和b的地址
  7. return 0;
  8. }

上述代码的运行结果:

0x7ffea42614bc 0x7ffea42614c0

 

 

说真的,对比上面的两部分代码,感觉C++和Golang还是差不太多的,可能更多的还是语法上的差异。

 

 

指针怎么用?

指针可以用来获取变量的地址,同时也可以用来获取变量对应的值。正确使用指针无论是在Golang中还是C++中,都是一件非常有趣且高效的事情。想要成为一名优秀的Golang开发工程师或者C++开发工程师,学习好指针的使用都是非常有必要的。

Golang

下面我们通过一个例子,来了解Golang中的指针是如何获取变量地址以及它的值的。

实例代码:


  
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. // 准备一个字符串类型
  7. var a = "Hello, world"
  8. // 获取字符串的地址, ptr类型为*string
  9. ptr := &a
  10. // 打印ptr的类型
  11. fmt.Printf( "ptr type: %T\n", ptr)
  12. // 打印ptr的地址
  13. fmt.Printf( "address: %p\n", ptr)
  14. // 对指针进行取值
  15. value := *ptr
  16. // 打印value的类型
  17. fmt.Printf( "value type: %T\n", value)
  18. // 打印value的值
  19. fmt.Printf( "value: %s\n", value)
  20. }

上述代码的运行结果:

ptr type: *string
address: 0xc000010210
value type: string
value: Hello, world

通过代码的执行结果,我们可以知道ptr是一个string字符串类型的指针,它的地址是0xc000010210,它指向的值是 Hello, world。

C++


  
  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4. // 准备一个字符串类型
  5. string a = "Hello, world";
  6. // 获取字符串的地址, ptr类型为*string
  7. string* ptr = &a;
  8. // 打印ptr的地址
  9. cout<< "address: "<< ptr << endl;
  10. // 对指针进行取值
  11. string value = *ptr;
  12. // 打印value的值
  13. cout<< "value: " << value << endl;
  14. return 0;
  15. }

上述代码的运行结果:

address: 0x7ffe0b9c8860
value: Hello, world

整体感觉,Golang和C++的差别不大。 

明显差异

通过上边的对比分析,我们可以发现Golang和C++很多地方都很相似。那么,它们二者之间有没有明显的区别呢?

答案是有的!

C++语言中可以直接对指针做算术运算(+、-、++、--),但是Golang中是不行的。

接下来看两段代码实例:

Golang


  
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. // 准备一个字符串类型
  7. var a = "Hello, world"
  8. // 获取字符串的地址, ptr类型为*string
  9. ptr := &a
  10. // 打印++ptr的地址
  11. fmt.Printf( "address: %p\n", ++ptr)
  12. // 打印ptr+1的地址
  13. fmt.Printf( "address: %p\n", ptr+ 1)
  14. }

上述代码的第16行和第19行都会报错,但是相同的操作在C++中都是可以的。

C++


  
  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4. // 准备一个字符串类型
  5. string a = "Hello, world";
  6. // 获取字符串的地址, ptr类型为*string
  7. string* ptr = &a;
  8. // 打印++ptr的地址
  9. cout<< "address1: "<< ptr+ 1 << endl;
  10. // 打印ptr+1的地址
  11. cout<< "address2: "<< ++ptr << endl;
  12. return 0;
  13. }

 上述代码的运行结果:

address1: 0x7fffe8bc9b80
address2: 0x7fffe8bc9b80

通过对比结果,我们可以看出Golang中不支持对指针进行算术运算,而这一点在C++中没有限制。

 

结论

今天只是非常基础的介绍指针在Golang和C++中的使用方法,在实际开发中会涉及很多其他类型的指针变量,比如数组指针、指针数组、对象指针等。这篇文章算是抛砖引玉吧,获悉更多C++和Golang内容,欢迎评论关注!公众号“玩转音视频”,分享超实用的音视频技能!

 


转载:https://blog.csdn.net/liuzehn/article/details/115433038
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场