Golang指針和C++指針的簡單剖析

目錄ios

  • 前言c++

  • 正文數組

  • 什麼是指針?markdown

  • 指針怎麼用?學習

  • 明顯差別編碼

  • 結論spa

前言

不止C++有指針,Golang也有指針呦!兩者有哪些區別呢?今天就來看一看。指針

正文

什麼是指針? 指針是用來指向任何一個變量的內存地址的類型變量,它所指向的變量的內存地址在 32 和 64 位機器上分別佔用 4 或者 8 個字節,佔用字節的大小與所指向的值的大小無關。code

Golangorm

下面咱們經過一個例子,來了解在Golang語言中是如何獲取變量的地址的。

實例代碼:

package main

import (
    "fmt"
)

func main() {
    var a int = 1 // 一個整型變量a
    var b string = "abcdefg" // 一個字符串變量b
    fmt.Printf("%p %p", &a, &b) // 分別輸出a和b的地址
}

複製代碼

上述代碼的運行結果:

0xc00007e020 0xc00005e1e0

值得注意的是,Golang中在聲明變量時,是可使用漢字的(這一點確實比C++要秀)。

好比,下面的編碼形式也是能夠編譯經過而且正確運行的,習慣了C++開發的朋友要是看到,確定強迫症都要犯了。。。

「個人意大利炮呢?」

package main

import (
    "fmt"
)

func main() {
    var 一個整型變量 int = 1
    var 一個字符串變量 string = "abcdefg"
    fmt.Printf("%p %p", &一個整型變量, &一個字符串變量)
}
複製代碼

上述代碼的運行結果:

0xc000016060 0xc000010210

C++

下面咱們經過一個例子來了解C++語言中是如何獲取變量的地址的。

實例代碼:

#include <iostream>
using namespace std;

int main() {
    int a  = 1; // 一個整型變量a
    string b  = "abcdefg"; // 一個字符串變量b
    cout<< &a <<" "<< &b <<endl; // 分別輸出a和b的地址
    return 0;
}
複製代碼

上述代碼的運行結果:

0x7ffea42614bc 0x7ffea42614c0

說真的,對比上面的兩部分代碼,感受C++和Golang仍是差不太多的,可能更多的仍是語法上的差別。

指針怎麼用?

指針能夠用來獲取變量的地址,同時也能夠用來獲取變量對應的值。正確使用指針不管是在Golang中仍是C++中,都是一件很是有趣且高效的事情。想要成爲一名優秀的Golang開發工程師或者C++開發工程師,學習好指針的使用都是很是有必要的。

Golang

下面咱們經過一個例子,來了解Golang中的指針是如何獲取變量地址以及它的值的。

實例代碼:

package main

import (
    "fmt"
)

func main() {

    // 準備一個字符串類型
    var a = "Hello, world"

    // 獲取字符串的地址, ptr類型爲*string
    ptr := &a

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

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

    // 對指針進行取值
    value := *ptr

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

    // 打印value的值
    fmt.Printf("value: %s\n", value)

}
複製代碼

上述代碼的運行結果:

ptr type: *string

address: 0xc000010210

value type: string

value: Hello, world

經過代碼的執行結果,咱們能夠知道ptr是一個string字符串類型的指針,它的地址是0xc000010210,它指向的值是 Hello, world。

C++

相同邏輯的一段C++代碼:

#include <iostream>
using namespace std;

int main() {

    // 準備一個字符串類型
    string a = "Hello, world";

    // 獲取字符串的地址, ptr類型爲*string
    string* ptr = &a;

    // 打印ptr的地址
    cout<<"address: "<< ptr <<endl;

    // 對指針進行取值
    string value = *ptr;

    // 打印value的值
    cout<<"value: " << value <<endl;
    
    return 0;
}
複製代碼

上述代碼的運行結果:

address: 0x7ffe0b9c8860

value: Hello, world

總體感受,Golang和C++的差異不大。

明顯差別

經過上邊的對比分析,咱們能夠發現Golang和C++不少地方都很類似。那麼,它們兩者之間有沒有明顯的區別呢?

答案是有的!

C++語言中能夠直接對指針作算術運算(+、-、++、--),可是Golang中是不行的。

接下來看兩段代碼實例:

Golang

package main

import (
    "fmt"
)

func main() {

    // 準備一個字符串類型
    var a = "Hello, world"

    // 獲取字符串的地址, ptr類型爲*string
    ptr := &a

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

}
複製代碼

上述代碼的第16行和第19行都會報錯,可是相同的操做在C++中都是能夠的。

C++

相同邏輯的一段C++代碼:

#include <iostream>
using namespace std;

int main() {

    // 準備一個字符串類型
    string a = "Hello, world";

    // 獲取字符串的地址, ptr類型爲*string
    string* ptr = &a;

    // 打印++ptr的地址
    cout<<"address1: "<< ptr+1 <<endl;

    // 打印ptr+1的地址
    cout<<"address2: "<< ++ptr <<endl;
    
    return 0;
}
複製代碼

上述代碼的運行結果:

address1: 0x7fffe8bc9b80

address2: 0x7fffe8bc9b80

經過對比結果,咱們能夠看出Golang中不支持對指針進行算術運算,而這一點在C++中沒有限制。

結論

今天只是很是基礎的介紹指針在Golang和C++中的使用方法,在實際開發中會涉及不少其餘類型的指針變量,好比數組指針、指針數組、對象指針等。這篇文章算是拋磚引玉吧,獲悉更多C++和Golang內容,歡迎評論關注!公衆號「玩轉音視頻」,分享超實用的音視頻技能!

相關文章
相關標籤/搜索