昨天晚上在cppblog上逛,发现一个关于对数组名取地址
的帖子,地址为http://www.cppblog.com/cuigang/archive/2008/04/04/46271.html
其中说到:
第3行和第4行有什么不同吗?其实从效果上来说是一样的,但是这里要注意 array 和 &array 的类型是不同的。array 相当于 &array[0],而 &array 是一个指向 int[100] 的指针,类型是 int(*)[100]。
以下代码可以看出这个不同:
运行结果可能是:
由于习惯使用sizeof来判断一个变量的类型,而实验了一下:
int array[100];
memset(array, 0, sizeof(array));
printf("sizeof(array)=%d, sizeof(&array)=%d/n", sizeof(array), sizeof(&array));
发现sizeof(array)和 sizeof(&array)结果一样,都为400,所以想当然的认为这两个的类型是一样的。
回头又查了下C专家编程(第9章),其中有说:
表达式中的数组名被编译器当作一个指向该数组第一个元素的指针。也即array为一指针类型。
另外注释中有提到:在使用sizeof()、&操作符取数组指针、数组为一字符串常量初始值的情况下,对数组的引用不能用指向该数组第一个元素的指针来代替。
因此array和&array类型是不一样的。array为一个指针,而&array是指向数组int [100]的指针。下面的代码(计算步长)也可以证明这个结论:
printf("array=%p, array+1=%p/n", array, array+1);
printf("&array=%p, &array+1=%p/n", &array, &array+1);
结果为:
array=0012FDF0, array+1=0012FDF4
&array=0012FDF0, &array+1=0012FF80
其中说到:
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
由于习惯使用sizeof来判断一个变量的类型,而实验了一下:
int array[100];
memset(array, 0, sizeof(array));
printf("sizeof(array)=%d, sizeof(&array)=%d/n", sizeof(array), sizeof(&array));
发现sizeof(array)和 sizeof(&array)结果一样,都为400,所以想当然的认为这两个的类型是一样的。
回头又查了下C专家编程(第9章),其中有说:
表达式中的数组名被编译器当作一个指向该数组第一个元素的指针。也即array为一指针类型。
另外注释中有提到:在使用sizeof()、&操作符取数组指针、数组为一字符串常量初始值的情况下,对数组的引用不能用指向该数组第一个元素的指针来代替。
因此array和&array类型是不一样的。array为一个指针,而&array是指向数组int [100]的指针。下面的代码(计算步长)也可以证明这个结论:
printf("array=%p, array+1=%p/n", array, array+1);
printf("&array=%p, &array+1=%p/n", &array, &array+1);
结果为:
array=0012FDF0, array+1=0012FDF4
&array=0012FDF0, &array+1=0012FF80