int a[10];. o' q+ ~, J# F! x% N0 S
8 C* a( q! z0 T! _* m) v: K 数组名是常量不能为左值(如:a = 5;)
/ k8 V6 b a2 S5 X# D7 U8 [
3 z2 u9 R& V- M2 V, e% x 不要认为数组元素a代表数组元素的值,它代表数组元素本身,可作为左值使用。
/ m' X0 z8 Z- V) _* x a0 [
! p z! ]7 K- o8 F7 ~- W q+ l7 Z 为指针进行初始化的字符串是只读的
' ~* p/ h- ]) R& c6 q L
$ S; [1 X m2 y8 b2 k* z* H (如:char *p = “hello”; strcpy(p, “world”);这样写是错的)
- }# L4 T* a& u/ m
( |) ^: t$ S7 }9 X6 P7 X4 [; q* Z 为数组进行初始化的字符串是可写的1 `+ O0 w( M/ k$ g- m
. X/ c$ P& }5 ^+ r: o9 j0 P3 o$ A
(如:char str[10] = “hello”;strcpy(str, “world”);这样写是对的)4 Q7 O; ]4 {' I* s$ W2 v; S5 I
( ~/ p$ m; D2 n* w" X- B 注意:1 b* Y; K% k C4 C/ C1 W
% d# K2 O9 V' a' n, p* R/ y 一直以为a代表数组的首地址,可以像指针一样进行a++等操作,但是,数组名代表数组首地址,一定是个常量!
2 b5 f7 \+ k4 v+ z' J3 M% c" f7 J0 U0 n3 |1 @$ x7 r4 N5 H8 v" l. ]) T
所以不能对数组名进行 a++ 或者是 a-- 的操作,因为常量不能被修改。
+ \% ]3 e7 G5 g( R5 a
* h6 s: Y! l. w( ^ 但如果定义指向数组的指针 *p=a;
- a8 k- p: o5 J6 c' J* V$ [+ Y/ W. \1 e# X" f1 [4 y/ \
那么这个指向该数组的指针是可以进行 p++ 或者是 p-- 操作的,指针可以通过这种方式来获取元素。9 ]2 e. g" R0 _4 f" }+ s( I
( w# f8 x$ D9 x
数组名 a 除了代表数组的首地址外,它还代表特定的类型,在此例中 a 代表了int[10] 这个类型。/ ~2 `5 l. a2 `0 h5 j1 T* V
1 s+ X+ e4 ^ q9 H
在编译环境内运行 prinrf(“%d %d)”,sizeof(a),sizeof(p)); 得到了40 4 。# B N, }) D# Y: [
+ i- R* Y, t3 [ 得到这个结果的原因就是数组名 a 代表了它所定义的数组类型int[10],此类型占了10个int型大小的内存,因此是长度是40。: @8 Z( C! U+ d- r( ?
$ q6 ^0 b& b" r+ _0 Y$ ~5 ~
而指针存放的就是某个地址值,不论它指向的是什么类型的地址,都占有固定的4个字节大小。5 `# d* o7 m: y8 q. }
0 e/ O3 Q: U, `; {$ E* p
直接访问 —— 用变量名访问。! p- s6 M2 w0 L0 I
! `% u1 r7 V, E, F$ U3 g1 E/ F9 X! y 间接访问 —— 用地址、指针访问。" n5 v9 T7 A* N" P! F. ^- }
5 @% n$ P6 u" T8 n- C8 Z7 G! X: @; C 间接访问: *(首地址 + 偏移) 偏移=下标值 * sizeof(数组元素类型)( t. w H8 t& l& y- Z
8 X Z. T6 s% n$ |2 _0 l. n0 @
? 通过数组下标访问数组元素也是间接访问。9 ~" s3 T* ~ }/ ~6 X" v+ z9 d
0 `1 ^2 u4 a- k a[ i ] *(a + i* sizeof(数组元素类型)) (每次偏移一个数组元素类型大小的字节数)4 }& ~& B. b! Q
! C J9 R, C! J# b2 `% j$ } 查看动态数组的大小:
. |( r2 a- v& c! a2 z" o
8 H% z, C, v! s! a! U } (注意头文件:#include )$ [8 C7 c: j9 U: y; m# \( t* @
' Z3 r' d4 C; z, s- k+ P
int *p = (int *)malloc(sizeof(int)*10);6 _# j$ Z z0 y# m- ~& c. V$ t) n
4 T) b/ o: f* g: r c/ \
printf(“%d ”,_msize(p)) ;. J2 c! O4 m& l
* Q% B+ B S6 T$ G. K3 l
输出结果是40。, h1 R( z2 r$ J' m l
* u8 h3 ^" \% U& K/ U9 R9 z 访问静态数组元素最灵活的方法:
. |. r l, G9 b5 o" L
$ A% l! n' ]/ `+ G4 E int a[] = {0,1,2,3,4,5};
& a, w/ X+ n( W$ W6 [' ]5 |: _- N9 }! W* ~# `6 M: L* F$ b
int i;
8 y+ M5 E/ B6 F# d, Z) c6 W! I+ l
. U' ^) w; M# ~ ? for( i = 0; i |