C 中指標與陣列

2021-10-02 05:19:48 字數 2130 閱讀 1348

使用陣列的時候編譯器一般會把它轉化成指標。 !!使用陣列下標時,通常使用size_t型別,是一種無符號型別

對陣列的元素使用取位址符就能得到指向該元素的指標。

string nums=

; string *p =

&nums[0]

;// p 指向 nums 的第乙個元素

// cout << *p << endl; 輸出:one

在很多使用到陣列名字的地方,編譯器都會自動地將其替換為乙個指向陣列首元素的指標

string *p2 = nums;

//等價於 p2 = &nums[0]

在大多數表示式中,使用陣列型別的物件其實是使用乙個指向該陣列首元素的指標。

可知,在一些情況下陣列的操作實際上是指標的操作。

使用陣列作為乙個 auto 變數的初始值時,推斷得到是指標而非陣列:

int ia=

;auto

ia2(ia)

;//ia2 是乙個指標,指向 ia 的第乙個元素

ia2 =22;

//錯誤:ia2是乙個指標

其中:

auto ia2(ia); 等價於 auto ia2(&ia[0]);

!!但是對於decltype(),則不會發生轉換。

返回的型別是乙個大小相同的陣列:

decltype

(ia) x =

;

指標也是迭代器:

對於 vector 和 string 的迭代器支援的運算,陣列的指標全部都支援。

也可以 for 指標遍歷陣列。

如:

int arr[size]=;

// 可以通過 &arr[0] 或者 arr 獲得首位址

// 可以通過 &arr[size] 獲得尾元素的下乙個位置的指標

int*b =

&arr[0]

;int

*e =

&arr[size]

;for

(int

*x = b;x != e;

++ x)

int

*b =

begin

(arr)

;int

*e =

end(arr)

;

指標運算

可以使用 vector 和 string 所有的迭代器運算。

constexpr size_t sz =5;

int arr[sz]=;

int*ip = arr;

// 等價於 int *ip = &arr[0];

int*ip2 = arr +4;

// ip2 指向 arr 的尾元素 arr[4]

同樣,兩個指標相減得到是它們之間的距離。型別是ptrdiff_t,定義在 cstddef 中,差值可能為負值,是帶符號型別

只有當兩個指標指向相關的物件時,才能夠進行比較。

下標運算與指標:

對陣列進行下標運算其實是對指向陣列元素的指標執行下標運算

int ia=

;int i = ia[2]

;int

*p = ia;

i =*(p +2)

;//等價於 i = ia[2]

int*p =

&ia[2]

;int j = p[1]

;//p[1] 等價於 *(p + 1),實際上是 ia[3]

int k = p[-2

];//p[-2] 等價於 *(p - 2),實際上是 ia[0]

!!內建的下標(???先打個問號)運算子所用的索引值可以是負數這一點與 vector 和 string 不一樣

C語言中指標陣列與陣列指標

1 指標陣列的實質是乙個陣列,這個陣列中儲存的內容全部是指標變數。2 陣列指標的實質是乙個指標,這個指標指向的是乙個陣列。1 int p 5 int p 5 int p 5 2 一般規律 int p p是乙個指標 int p 5 p是乙個陣列 3 如果核心和 結合,表示核心是指標 如果核心和 結合,...

C 中指標陣列的分配與釋放

c 中可用new和delete關鍵字分配和釋放記憶體,但是如果遇到指標陣列 或指向指標的指標 分配和釋放必須慎重,不然容易造成記憶體洩漏。下面用一段 給出如何使用指向指標的指標來分配和釋放記憶體 int n cin n 分配記憶體 char pstrarray new char n for int ...

C 中指標常量與常量指標

指標是一種特殊的變數,它裡面儲存的內容是記憶體位址。常量是指其裡面儲存的內容不能發生改變的量。明白了這兩個概念後,我們現在正式進入指標常量與常量指標。1.指標常量與常量指標的概念 指標常量就是指標本身是常量,換句話說,就是指標裡面所儲存的內容 記憶體位址 是常量,不能改變。但是,記憶體位址所指向的內...