这两天有人问以下有什么代码有什么不同?
第3行和第4行有什么不同吗?其实从效果上来说是一样的,但是这里要注意 array 和 &array 的类型是不同的。array 相当于 &array[0],而 &array 是一个指向 int[100] 的指针,类型是 int(*)[100]。
以下代码可以看出这个不同:
运行结果可能是:
1
int
array[
100
];
2
3 memset(array, 0 , sizeof(array));
4 memset( & array, 0 , sizeof(array));
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]。
以下代码可以看出这个不同:
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 }
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 }
运行结果可能是:
p1
=
0x0022FDF8
p2 = 0x0022FDF8
p1 [ 2 ] = 2
p2 [ 2 ] = 2294040
(*p2) [ 2 ] = 2
p2 = 0x0022FDF8
p1 [ 2 ] = 2
p2 [ 2 ] = 2294040
(*p2) [ 2 ] = 2
&array 这个在C标准里是未定义的,这是个错误的写法。因为&是取地址的
操作符,它的操作数是一个左值,而array 是一个数组名是一个符号常量
,是一个右值它代表一个数组的首地址(常量地址)。
所以&array是非法的。虽然很多编译器不报错,
而且也正常但是不提倡这种写法。
转载于:https://blog.51cto.com/19880512/367034