数组和指针可交换性的总结
1.用a[i]这样的形式对数组进行访问总是被编译器“改写”或解释为像*(a + 1)这样的指针访问。
2.指针始终就是指针。它绝不可以改写成数组。当指针作为函数参数时,你可以用下标形式访问
指针,而且你知道实际传递给函数的是一个数组。
3.在特定的上下文中,也就是它作为函数的参数时(也只有这种情况),一个数组的声明可以看
作是一个指针。作为函数参数的数组(就是在一个函数调用中)始终会被编译器修改成为指向数组第一个元素的指针。
4.因此,当把一个数组定义为函数的参数时,既可以选择把它定义为数组,也可以定义为指针。不管选择那种方法,在函数内部事实上获得的都是一个指针。
5.在其他所有情况中,定义和声明必须匹配。如果定义了一个数组,在其他文件对它进行声明时也必须把它声明为数组,指针也是如此。
/*
** array_summary.
*/
#include <stdio.h>
#include <stdlib.h>
void print_array( int arr[], int number );
void print_array_2( int *pa, int number );
int main( void ){
int arr[] = {1, 2, 3};
int *p;
int size;
size = sizeof(arr) / sizeof(*arr);
p = arr;
printf( "arr[0] = %d, *(arr + 0) = %d\n", arr[0], *(arr + 0) );
printf( "arr = %p, p = %p\n", arr, p );
printf( "sizeof(arr) = %zd, sizeof(arr) / sizeof(*arr) = %zd\n", sizeof(arr), size );
print_array( arr, size );
print_array_2( p, size );
return EXIT_SUCCESS;
}
void print_array( int arr[], int number ){
int i;
printf( "sizeof(arr) = %zd\n", sizeof(arr) );
for( i = 0; i < number; ++i ){
printf( "%d ", arr[i] );
}
printf( "\n" );
}
void print_array_2( int *pa, int number ){
int i;
printf( "sizeof(pa) = %zd\n", sizeof(pa) );
for( i = 0; i < number; ++i ){
printf( "%d ", pa[i] );
}
printf( "\n" );
}
输出: