C语言(八) 指针(2)数组和指针

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

猜你喜欢

转载自blog.csdn.net/liu362732346/article/details/81944688
今日推荐