使用陣列的時候編譯器一般會把它轉化成指標。 !!使用陣列下標時,通常使用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.指標常量與常量指標的概念 指標常量就是指標本身是常量,換句話說,就是指標裡面所儲存的內容 記憶體位址 是常量,不能改變。但是,記憶體位址所指向的內...