-
int arr[3]数组类型,去掉arr就是它的类型:int [3],这里3不能掉,类型大小为12。如果是int [2],类型大小就是8.
- 数组的内存是连续递增的
- 数组的创建方式:
type_t arr_name[const_n];
ps:1.type_t是指数组的元素类型;
2.const_n是一个常量表达式,用来指定数组的大小
3.C99语法支持变常数组 --- 数组的大小是变量,但VS2019不支持C99语法
一维数组的初始化
char ch1[ ] = {'a', 'b', 'c');//打印结果为:abc烫烫烫
char ch2[ ] = "abc";//打印结果为:abc
ch1出现乱码,原因是:
ch2中,字符串会默认加上'\0',而ch1不会,所以它会一直往后打印,直到遇到'\0'.所以后面显示乱码
求数组长度时,strlen遇'\0'会停止,所以ch1的长度为一个随机值(因为你不知道内存的'\0'在哪里),ch2的长度为3
打印字符串的两种方法:
1.for循环
2.printf("%s",ch1);
printf("%s",ch2);
二维数组的初始化(以下数组的行可以省略,但是列不能省略!):
- int arr[3][4] ;
- int arr[3][4] = { 0 };
- int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10 };
- int arr[3][4] = { {1,2},{3,4},{5,6} };//没有初始化的地方补0
- int arr[3][4] = { {1,2},{},{5,6} };//第二行不进行初始化
三维数组也是能省略一维,二维与三维都不能省略。
将二维数组看为一维数组:
如果要找第三行的数据:arr[2],arr[2]即为第三行的数组名。
数组越界 --- 越界访问
数据越界时,编译器有时是不会访问的,因为数组地址是连续存放的,会打印数组后面的数
二维数组越界:不管是行和列,都有可能存在越界,但是二维数组行越界,使用的依然是自己内存里的数,即后面一片的数据,因为二维数组在内存中也是连续排列的。
数组名
数组名确实能表示首元素的地址,但是有两个例外(除此之外数组名都表示首元素的首地址):
- 1.sizeof(arr)中,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。
- 2.&数组名,这里的数组名表示整个数组,取出来的是整个数组的地址
所以传完参之后,只能int* p = arr ; p++; 如果:arr++就错了!因为arr一加跳过的就是整个数组!!!printf("%p\n", &arr[0]); printf("%p\n", arr); printf("%p\n", &arr); //区别: printf("%p\n", &arr[0]+1); printf("%p\n", arr+1);//这个和上面那个都是跳过4个字节,即arr元素类型的大小 printf("%p\n", &arr+1);//此时是代表整个数组的地址,如果加1就是直接跳整个数组
二维数组的数组名的理解
- int a[3][4];
sizeof(arr);//48个字节,此时表示整个二维数组的地址 - &arr一样,也是表示整个二维数组的地址,如果+1,跳过的就是整个二维数组
- arr;二维数组的数组名也表示整个数组首地址,此时需要想象成一维数组,此时表示的是arr[0]这一行的地址。
计算二维数组几行几列:
int row = sizeof(arr) / sizeof(arr[0]);//计算几行
int col = sizeof(arr[0]) / sizeof(arr[0][0]);//计算几列
一维数组传参
一维数组传参有两种方式:
1.char str[ ]//参数部分写出数组的形式
2.char* str[ ]//参数部分写出指针的形式
二维数组传参
假设二维数组int arr[m][n]
方法1:
传参:
fun(arr);
//这里只能写数组名!
//(ps:) fun(a[m][n])或fun(a[][n])都不行!!!
接收:
arr[0]等价于 -->*(arr + 0)
fun (int arr[m][n])
//或者
fun (int (*arr)[n])
//ps:注意是int (*arr)[n]而不是int* arr[n]
//因为[]的优先级比*大
在函数操控元素:
1. *(a[i]+j) //代表第i行第j列
2. *(*(a+i) + j) //代表第i行第j列
3.*((int *)a + i*n +j) //代表第i行第j列
//不管怎么样,a[i][j]不被允许。也是由编译器的寻址方式决定。
方法2:
传参:
fun((int **)a,int n);//此时实参就不能为数组名了
接收:
int fun((int **)a,int n);
在函数操控元素:
*((int *)a + i*n +j) //代表第i行第j列
//不管怎么样,a[i][j]不被允许。也是由编译器的寻址方式决定。
易错
二维数组传参无法从小数组传到大数组,数组中元素的个数只能填相应的个数
但一维数组可以