前面已經和大家詳細的介紹了指標的用法,那麼所謂的指標陣列和陣列指標到底有何變化,之間有什麼聯絡呢?是否表示乙個意思,還是有不同含義,下面就聊聊。
首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身的大小決定,每乙個元素都是乙個指標,在32 位系統下任何型別的指標永遠是佔4 個位元組。它是「儲存指標的陣列」的簡稱。
首先它是乙個指標,它指向乙個陣列。在32 位系統下任何型別的指標永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道,具體要看陣列大小。它是「指向陣列的指標」的簡稱。
當指標表示在後的時候,說明是個指標,只是指向乙個陣列;
當指標表示在前的時候,說明它是乙個陣列,只是陣列的元素都是指標。
這樣大家應該就能明白我說的是什麼。
int
(*p)
[n]
()優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p+1時,p要跨過n個整型資料的長度。
//定義二維陣列
int a[3]
[4];
//該語句是定義乙個陣列指標,指向含4個元素的一維陣列。
int(
*p)[4]
;//將該二維陣列的首位址賦給p,也就是a[0]或&a[0][0]
p=a;
//該語句執行過後,也就是p=p+1;p跨過行a[0]指向了行a[1]
p++;
所以陣列指標也稱指向一維陣列的指標,亦稱行指標。
在二維陣列裡面
a,&a,a[0],&a[0],&a[0][0]五個值是一樣的,都指向二維陣列的首位址(起始位置)
區別在於這五種表達方式的型別是不同的,以int a[2][3]舉例:
a是二維陣列名,是常量,存放著二維陣列的首位址,型別為二維陣列,sizeof(a)=24
&a 二維陣列a的(首)位址,本身是乙個指標,sizeof(&a)=4,指標型別都為4
a[0]指向二維陣列中的第一行陣列a[0],型別是一維陣列sizeof(a[0])=12
&a[0]代表a[0]的位址,與一維陣列名a[0]值相同,但本身是指標型別sizeof(&a[0])=4
&a[0][0]表示二維陣列中第乙個元素的位址,指標型別sizeof(&a[0][0])=4
int
*p[n]
優先順序高,先與p結合成為乙個陣列,再由int*說明這是乙個整型指標陣列,它有n個指標型別的陣列元素。這裡執行p+1時,則p指向下乙個陣列元素。
下面這樣賦值是錯誤的:
p=a;
*p=a;這裡*p表示指標陣列第乙個元素的值,也就是a的首位址的值。
如要將二維陣列賦給一指標陣列:
int
*p[3];
int a[3]
[4];
p++;
for(i=
0;i<
3;i++
)p[i]
=a[i]
這裡int *p[3] 表示乙個一維陣列內存放著三個指標變數,分別是p[0]、p[1]、p[2];所以要分別賦值。
陣列指標只是乙個指標變數,似乎是c語言裡專門用來指向二維陣列的,它占有記憶體中乙個指標的儲存空間。
指標陣列是多個指標變數,以陣列形式存在記憶體當中,占有多個指標的儲存空間。
還需要說明的一點就是,同時用來指向二維陣列時,其引用和用陣列名引用都是一樣的。
比如要表示陣列中i行j列乙個元素:
*
(p[i]
+j)、*(*
(p+i)
+j)、(
*(p+i)
)[j]、p[i]
[j]
優先順序:() > > *
下面到底哪個是陣列指標,哪個是指標陣列呢:
a)
int*p1[10]
;b)int(
*p2)[10
];
在這之前首先需要明白乙個符號之間的優先順序問題。
先分析a)中「」的優先順序比「*」要高。
p1 先與「」結合,構成乙個陣列的定義,陣列名為p1,int *修飾的是陣列的內容,即陣列的每個元素。那現在我們就好理解了,這是乙個陣列,其包含10 個指向int 型別資料的指標,即指標陣列。
再分析b)中「()」的優先順序比「」高。
「*」號和p2 構成乙個指標的定義,指標變數名為p2,int 修飾的是陣列的內容,即陣列的每個元素。陣列在這裡並沒有名字,是個匿名陣列。
那現在我們清楚p2 是乙個指標,它指向乙個包含10 個int 型別資料的陣列,即陣列指標.
如下圖所示:
舉例說明a 和&a 之間的區別,**如下:
int
main()
; char (
*p3)[5
]=&a; char (
*p4)[5
]= a;
return0;
}
p3+1 的值會是什麼?p4+1 的值又會是什麼?毫無疑問,p3 和p4 都是陣列指標,指向的是整個陣列。
&a 是整個陣列的首位址;
a是陣列首元素的首位址。
其值相同但意義完全不同。
在c 語言裡,賦值符號「=」號兩邊的資料型別必須是相同的,如果不同需要顯示或隱式的型別轉換。
p3 這個定義的「=」號兩邊的資料型別完全一致,而p4 這個定義的「=」號兩邊的資料型別就不一致了。
左邊的型別是指向整個陣列的指標,右邊的資料型別是指向單個字元的指標。
現在清楚了p3 和p4 都是指向整個陣列的,那p3+1 和p4+1 的值就很好理解了。
把陣列長度改小點,會有什麼問題?p3+1 和p4+1 的值又是多少呢?
int
main()
; char (
*p3)[3
]=&a; char (
*p4)[3
]= a;
return0;
}
把陣列長度改大點,又會有什麼問題?
int
main()
; char (
*p3)[10
]=&a; char (
*p4)[10
]= a;
return0;
}
這時p3+1 和p4+1 的值又是多少呢?
得到的結果:
(1).char (*p2)[5]=a;
必須使用強制轉換,如:
char (
*p2)[5
]=(char (*)
[5])a;
error c2440:
'initializing'
: cannot convert from 'char (*)[5]' to 'char (*)[3]'
error c2440:
'initializing'
: cannot convert from 'char (*)[5]' to 'char (*)[10]'
(3).把以上程式更改後成功執行**如下:
int
main()
; char (
*p1)[5
]=&a; char (
*p2)[5
]=(char (*)
[5])a;
printf
("a=%d\n"
,a);
printf
("a=%c\n"
,a[0])
;printf
("p1=%c\n",*
*p1)
;printf
("p2=%c\n",*
*p2)
;printf
("p1+1=%c\n",*
*(p1+1)
);printf
("p2+1=%c\n",*
*(p2+1)
);return0;
}
執行結果:
a=
1638208
a=ap1=a
p2=a
p1+1
=?p2+1=?
press any key to continue
後面的結果可以自己去試試看,得到的是什麼。
結論:
根據指標型別及所指物件,表示指標大小,每次加1,表示增加指標型別大小的位元組.
C語言中指標和陣列
首先,明確乙個概念,指標是什麼,一旦提到這個老生常談且富有爭議性的話題,那真是1000個人有1000種看法。在國內的很多教材中,給出的定義一般就是 指標就是位址 從初步理解指標的角度來說,這種說法是最容易理解的,但是這種說法明顯有它的缺陷所在。指標就是位址 這種說法相當於 指標 字面值位址 或者說乙...
C語言中指標陣列與陣列指標
1 指標陣列的實質是乙個陣列,這個陣列中儲存的內容全部是指標變數。2 陣列指標的實質是乙個指標,這個指標指向的是乙個陣列。1 int p 5 int p 5 int p 5 2 一般規律 int p p是乙個指標 int p 5 p是乙個陣列 3 如果核心和 結合,表示核心是指標 如果核心和 結合,...
go 指標陣列 go語言中的指標陣列
宣告乙個包含有5個整數指標型別的陣列,我們可以在初始化時給相應位置的元素預設值。下面是給索引為0的元素乙個新建的的int型別指標 預設為0 給索引為1的元素指向值v的位址,剩下的沒有指定預設值的元素為指標的zero值也就是nil package main import fmt func main f...