int a[3][4];
int (*p)[4] = a;
p = &a[2]; // 這裡為什麼需要取位址符?
c++中a[2]不就是下級陣列名嗎?為什麼還要取位址?
根據這個問題,我發現了自己對指標和引用還有陣列實質的理解還是有點模糊,比如問題中提到的:a[2]不就是下級陣列名嗎?我沒法確切給出答案,因為我也不確定。這個問題下面討論會再提到。
先來看看這幾個等式為什麼成立:
int a[3][4] ,這是乙個我們印象中3行4列的二維陣列,用gcc的typeid().name()函式顯示型別表示是a2_a3_i;;int (*p) [4]表示的是乙個指向一些一維陣列(4個int型)的指標p,也就是p指向的資料必須是一些長度固定為4的一維陣列,表示為pa3_i。見如下**
#include
#include
#include
#include
using
namespace
std;
int main(void)
; //int** b = a; //int** 無法被覆蓋為int(2)(3)
int (*b)[4] = &a[2];
int (*c)[4] = a;
cout
<
<
<
<
/*a的型別 a3_a4_i
c的型別 pa4_i
*/
1.這兩者的型別我們從上面可以看出來並不是一樣的,為什麼可以掛上等號呢?這裡提到乙個指標轉換的規則,c++內部自定的隱式轉換:
方便理解,我直接把翻譯visual studio 2015的官方文件示例粘了張拿過來
看中這個例子,我們大概知道,c++的陣列會自動轉換成指向第乙個元素的指標,而且這是大部分情況下,也就是說,儘管我們定義了乙個type a[n]型別的陣列物件,但是在編譯器大部分時候認識它的形式是將其看成乙個指標,比如在執行以下操作時候:
a+1 ——指標
*a ——指標
a[0],a[1]….. ——指標
&a ——非指標
也就是說,除了&符號,其他都是將a這個物件看做指標來使用(注意是a這個物件)
再來解釋上面的問題,使用陣列a時候,a被隱式轉換成了指向第乙個元素的指標,每乙個元素是int[4]型,所以最後成了指向int[4]型的指標,也就是int(*)[4],和c的型別相等了,那麼對其進行初始化就沒什麼難理解了。
2.解釋第二個問題,為什麼要對a[2]取位址符號?
int main(void)
; int b[4] = ;
int e[2] = ;
int(*ptr)[4] = a;
int* ptr1[4] = ; //這個表示4個int*型的元素
cout
<
<
<
<
/*ptr的型別是 pa4_i
ptr1的型別是 a4_pi
*/
很明顯,我們可看到,ptr是乙個指向a4_i型別的指標ptr1是乙個包含4個指標元素的陣列,另外提一句,**中ptr1中的4個陣列名字b b e e都經過了隱式指標轉換成了int*型。
5.char型指標陣列
#include
#include
#include
#include
using
namespace
std;
int main(void)
; //**這一段是初始化,賦值的話需要單獨對乙個個指標進行賦值就像下面這樣**
/* line[0] = "aaa";
line[1] = "bbb";
line[2] = "ccc";
line[3] = "ddd";
line[4] = "eee";
*/ line2 = &b;
//line2只支援長度為5的char陣列對其進行賦值
cout
<
<
<
<
/*line a5_pc
line2 pa5_c
*/
這裡可以推得和上面的ptr類似,上面的line是5個指向char陣列的的指標陣列,但是注意一點,這裡的line2是乙個指向乙個長度為5的char型陣列的指標。而且僅僅只能是長度為5的char型陣列才能賦值給line2,這一點和其他型別不一樣,它指定了乙個指定長度的char型陣列(這也是char型自身決定的),所以它被看做乙個帶長度的char*指標,不能賦字串常量給它,只能將長度為5的char陣列(也就是char[5])的位址給其賦值6.取位址&,去位址*
#include
int main(void)
/*the value is: 1
*/
&還有乙個作用是取位址,上面提到過取乙個變數的位址。而*呢?對應的是去往那個位址所在的地方,將值給拿出來,將其稱為去位址。
上面這個等式中就用到了這個兩者:先將&a位址值轉換成乙個int *指標,再對這個指標去位址,那就是去變數a的位址上的值了唄,之後再將這個值的位址(還是a的位址)進行乙個取位址,賦給指標變數(指標不就是專門用來存位址值的唄)
上面兩個操作符號,正式一點叫&引用,和解除引用(去引用),&(((int*)&a)); 中第乙個&的作用也叫脫去解引用,顧名思義:脫掉這個解引用(感覺繞來繞去還不如取位址和去位址簡單易懂….@__@),具體的做法草考給出的博文鏈結
總結:
大致先給出這些,以後還有補充繼續寫後篇
有什麼錯誤還希望指出
C 中 指標和引用
相信很多c 初學者都搞不清指標和引用是個什麼玩意,這裡我也不寫其定義。主要解釋 和 的作用。相信看完以後一定會有收穫的。首先,看起幾個常見的例子 int i 520 int r i int p p i p i int r2 p以上是一些c 中常見的寫法.其中 和 既能作為表示式的運算子,也能作為申明...
C 中 (指標引用)和 (指標)的區別
很久之前學的c 了,複習一下,指標是乙個存放位址的變數,而指標引用指的是這個變數的引用,眾所周知c 中如果引數不是引用的話會呼叫引數物件的拷貝建構函式,所以如果有需求想改變指標所指的物件 換句話說,就是要改變指標裡面存的位址 就要使用指標引用,在網上看到大佬的 簡單明瞭,如下 include usi...
C 中指標引用和指標的區別
指標 是位址 即記憶體單元的編號 指標變數 是乙個存放位址的變數 指標引用 指的是這個指標變數的引用 眾所周知c 中如果引數不是引用的話會呼叫引數物件的 拷貝建構函式 重新開闢一塊一模一樣的記憶體空間 所以如想改變指標變數裡面存的位址,就要使用指標引用 讀 前請先搞懂 二級指標 指標的指標 指向指標...