对数组名取地址是什么?
Code highlighting produced by Actipro CodeHighlighter (freeware)
1
int
array[
100
];
2
3
memset(array,
0
, sizeof(array));
4
memset(
&
array,
0
, sizeof(array));
1 int array[ 100 ];
2
3 memset(array, 0 , sizeof(array));
4 memset( & array, 0 , sizeof(array));
第3行和第4行有什么不同吗?其实从效果上来说是一样的,但是这里要注意 array 和 &array 的类型是不同的。array 相当于 &array[0],而 &array 是一个指向 int[100] 的指针,类型是 int(*)[100]。
以下代码可以看出这个不同:
Code highlighting produced by Actipro CodeHighlighter (freeware)
1
#include
<
stdio.h
>
2
3
int
main()
4
{
5
int
array[
100
]
=
{
0
,
1
,
2
};
6
typedef
int
(
*
ARRAY)[
100
];
7
int
*
p1
=
array;
8
ARRAY p2
=
&
array;
9
//
int* p3 = &array;
//
这样编译错误
10
11
printf(
"
p1 = 0x%08X\n
"
, p1);
12
printf(
"
p2 = 0x%08X\n
"
, p2);
13
printf(
"
p1[2] = %d\n
"
, p1[
2
]);
14
printf(
"
p2[2] = %d\n
"
, p2[
2
]);
15
printf(
"
(*p2)[2] = %d\n
"
, (
*
p2)[
2
]);
16
17
getchar();
18
return
0
;
19
}
1 #include < stdio.h >
2
3 int main()
4 {
5 int array[ 100 ] = { 0 , 1 , 2 };
6 typedef int ( * ARRAY)[ 100 ];
7 int * p1 = array;
8 ARRAY p2 = & array;
9 // int* p3 = &array; // 这样编译错误
10
11 printf( " p1 = 0x%08X\n " , p1);
12 printf( " p2 = 0x%08X\n " , p2);
13 printf( " p1[2] = %d\n " , p1[ 2 ]);
14 printf( " p2[2] = %d\n " , p2[ 2 ]);
15 printf( " (*p2)[2] = %d\n " , ( * p2)[ 2 ]);
16
17 getchar();
18 return 0 ;
19 }
运行结果可能是:
Code highlighting produced by Actipro CodeHighlighter (freeware)
p1
=
0x0022FDF8
p2
=
0x0022FDF8
p1
[
2
]
=
2
p2
[
2
]
=
2294040
(*p2)
[
2
]
=
2
p1 = 0x0022FDF8
p2 = 0x0022FDF8
p1 [ 2 ] = 2
p2 [ 2 ] = 2294040
(*p2) [ 2 ] = 2