本文只记录注意点

1.数组的定义过程

1.定义数组

数组大小必须确定

手动指定大小

  1. [类型] 名字 [大小];
  2. [类型] 名字 [大小]={1,,1}

编译器指定

  1. [类型] Name []={1,12,12}

一种特别的定义方式

  1. [Type] Name {} ={[指定下标]=1,[指定下标]} int array3[]={[1]=1,[4]=3}; 数组的长度默认是 最大下标+1

作为函数参数的时候可以 int array[] 。其他情况不行。

2.更改名字

数组在声明时,编译器自动为 数组分配了内存地址,这个地址与数组名是绑定的,不可更改。

1
2
3
4
5
6
7
8
9
int a[]={12,12,123}
int b[2]=a;
[Error] incompatible types when assigning to type 'int[2]' from type 'int *'

int a[]={12,12,123}
int b[2];
b=a;
都会报错

How?

使用指针

1
2
3
int a[]={12,12,1};
int *b;
b=a;

但这里会存在一个问题,数组变量变成指针变量后,大小会发生改变。当数组被当成参数传递后,默认传递的是一个 ==指针变量==则使用 sizeof 得到的结果会发生变化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int array1[]={1,1,4,5,5,12};
printf("转换指针前的大小 %zd \n",sizeof(array1));
int *ppp=array1;
printf("转换指针后的大小 %zd \n",sizeof(ppp));
=================================================
转换指针前的大小 24
转换指针后的大小 8



void testAaary(int *array1, int array2[]){
printf("传递后array1大小为 %zu \n",sizeof(array1));
printf("传递后array2大小为 %zu \n",sizeof(array2));
}

int main(){
int array1[]={1,1,4,5,5,12};
int array2[]={2,4,5,6,2,26};
printf("array1传递前数组的大小为 %zd \n",sizeof(array1));
printf("array2传递前数组的大小为 %zd \n",sizeof(array2));
testAaary(array1,array2);
return 0;
}
===========================================
array1传递前数组的大小为 24
array2传递前数组的大小为 24
传递后array1大小为 8
传递后array2大小为 8

2.参数传递

  1. 一维度数组传递作为参数

    1
    void arrayTest(int array1[],int len){}
  2. 二维或多维度 —-> ==除了第一维度可以使用参数传递,其他的都需要在定义的时候就写好!

1
void arrayTest(int array1[][3],int len)
  1. 直接使用 字面量 进行传参
1
2
3
int sum_array(int *a,int len);

int a=sum_array( (int []){1,2,3},5)

3.多维数组

并没有什么区别,只是 如果使用 一个 array[0] 访问则是 一整个数组的地址。

1
2
3
4
5
6
7
   //多维数组
printf("==========多维数组===================\n");
int array5[][2]={{123,123},{124,124}};
//访问变量。
printf("%d\n",array5[0][0]);
printf("%d\n",**array5 );
printf("%d\n",*(array5[0]) );