1.传入函数的数组成了什么
函数参数表中的数组实际上是指针
- sizeof(a) == sizeof(int *) //这里的a是数组 int a[];
- 但是可以用数组的运算符[]进行运算
- test(int a[]) 等价于 test(int *a)
int main(int argc, char *argv[]) {
int a[] = {1,2,3,4,5,6,7,8};
int min,max;
printf("main sizeof(a) = %lu\n",sizeof(a));
minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
printf("min == %d\n",min);
printf("max == %d\n",max);
return 0;
}
/*这里的参数int a[] 可以换成 int *a */
void minmax(int a[] , int len , int *min , int *max){
int i;
printf("minmax sizeof(a) = %lu\n",sizeof(a));
*min = *max = a[0];
for(i =1 ;i < len ; i++){
if(a[i] < *min){
*min = a[i];
}
if(a[i] > *max){
*max = a[i];
}
}
}
/*运行结果*/
main sizeof(a) = 32 //一个int 占4位,8个数占32位
minmax sizeof(a) = 8 //64位中int * 是8位
min == 1
max == 8
2.数组变量是特殊的指针
数组变量本身表达地址
- int a[10]; int *p = a; //无需用&取地址
- 但是数组的单元表达的是标量,需要用&去地址
- a == &a[0]
int a[] = {1,2,3,4,5,6,7,8};
int *p = a;
printf("*p == %d\n",*p);
printf("a[0] == %d\n",a[0]);
printf("p == %p\n",p);
printf("&a[0] == %p\n",&a[0]);
/*取数组地址的时候,无需用&,可以直接int *p = a, 指针p的地址指向a[0] ,*p取到的值也是a[0]的值 */
/*运行结果*/
*p == 1
a[0] == 1
p == 000000000022FE20
&a[0] == 000000000022FE20
- 数组标量是const 指针 //int b[] --> int *const b;
int a[] = {1,2,3,4,5,6,7,8};
int b[] = a; //Error!! 数组之间不能互相赋值invalid initializer!因为int b[] <===> int b
//*const;
int *p = a; //ok