目錄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內容,歡迎評論關注!公衆號「玩轉音視頻」,分享超實用的音視頻技能!