数组名在一定的上下文表示整个数组或首元素地址(特殊指针)
数组名表示一块内存的首地址,这块内存的大小取决于元素类型及元素数量。
指针在一定的上下文中表示可以做左值的指针变量或做右值的指针值(一个地址值)。
指针变量也是一块内存的首地址,这块内存的大小是一个字长(word size),对于32位平台而言,就是32个位,4个字节。指针变量的值为目标对象的地址。
数组名在一定的上下文中表示整个数组,如与运算符“sizeof“及取址运算符"&"一起使用时:
int arr2[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int size = sizeof arr2 / sizeof arr2; // 3
int (ap)[3][4] = &arr2;
数组名在其它上下文中表示数组首元素的地址,类型为元素类型:
int arr2[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int (arp)[4] = arr2;
当函数形参使用数组指针或指针变量指向数组时,运算符“[]”、“”可以替换使用,但当使用extern声明外部变量时,则不可以替换使用:
include
extern int arr[]; // 与extern一起使用时,[]与不能相互替换
//int arr[5] = {1,3,5,7,9}; // 在另一cpp文件中,定义了全局数组arr
//extern int arr; // error,当取arr的值时,其值
void foo(int arr,int size) // 用做函数形参时,[]与可以相互替换
{
for(int i=0;i<size;i++)
printf("%d ",arr[i]);
printf("\n");
}
void func(int arr[],int size)
{
for(int i=0;i<size;i++)
printf("%d ",arr[i]);
printf("\n");
}//代码效果参考:http://www.zidongmutanji.com/zsjx/221901.html
int main(void) {
const int size = 5;
foo(arr,size);
func(arr,size);
getchar();
return 0;
}
声明外部数组,需使用运算符“[]”,使用该声明时,取的是其地址值:
19: foo(arr,size); // extern int arr[];
0040116F push 5
00401171 push offset arr (00425a48)
00401176 call @ILT+10(foo) (0040100f)
声明外部数组,如果使用运算符“*”,使用该声明时,取的是其地址所在的值,也就是元素的值,当元素不是一个指针时,往往是一个非法地址值:
19: foo(arr,size); // extern int* arr;
0040116F push 5
00401171 mov eax,[arr (00425a48)]
00401176 push eax
00401177 call @ILT+10(foo) (0040100f)
-End-