1、一维数组
<1> 一维数组名
在以下两种情况下数组名不是指向数组首元素的指针
1:sizeof(数组名) //数组所占字节数
sizeof(指针) //指针类型所占字节数:4字节(任意类型指针)
2:&(数组名) //得到指向数组的指针(数组指针),步长为数组大小
printf("%d\n",&数组名);
printf("%d\n",&数组名+1); //偏移一个数组
数组名是一个指针常量----指针的指向不可以修改,指向的值可以修改
int arr[]={5,6,7,8};
arr[0]=10; //指向的值可以修改
arr=NULL(错) //指针的指向不可以修改
<2> 一维数组定义–初始化
//整型数组定义--初始化
(1) int arr[5]; //定义含5个int类型元素的数组 未初始化--元素值未知(乱码)
(2) int arr[5] = { 1,2 }; //剩余位补0
(3) int arr[5]={0}; //定义含5个int类型元素的数组 初始化为0
(4) int arr[]={4,3,5,8} //定义初始化可省略数组大小,系统根据初始化元素个数给数组大小赋值
//字符数组初始化为空
(1) char str[10]="";
(2) char str[10] = { '\0' };
(3) char str[5] = { NULL };
(4) memset(str, 0 ,sizeof(str));
//字符数组初定义--始化(字符)
(1) char ch[5]; //定义未初始化 元素值未知(乱码)
(2) char ch[5]={'a'} //第一个元素初始化为 'a' 剩余未补 '\o'
(3) char ch[]={'H','e','l','l','o'} //字符数组 sizeof(ch)=5
在C语言中,字符串是当做字符数组来处理的;所以字符串有两种声明方式,一种是字符数组,一种是字符指针。
//字符数组初定义--始化(字符串)
(1) char str[6]={'H','e','l','l','o','\0'} //必须加 '\0'
(2) char str[5]={'H','e','l','l','o','\0'} //错 无 '\0'位置,字符串无结束标志位
//字符串常量来初始化字符数组
(3) char str[]={"hello"};
(3) char str[]="hello";
//不能用于字符数组的赋值
char str[6]; //str指向内存
str="hello"; //错误---str指向字符常量
//字符数组赋值
strcpy(str,"hello");
//字符指针:在C语言中我们也可以使用字符指针来存储字符串
(4)char *str="hello";
<3> 数组做函数形参
数组做函数参数是会被降级—指向数组第一个元素
在函数内不能使用sizeof(数组名)来求数组所占空间大小
void test(int arr[]); //可读性较高
//等价于
void test(int *arr);
//调用
text(arr); //实参传数组名
<4> 数组索引可以为负值
int arr[5]={1,2,3,4,5};
printf("%d\n",arr[3]); //可读性较高
//等价于
printf("%d\n",*(arr+3));
int *p=arr;
p=p+3;
printf("%d\n",p[-1]);
//等价于
printf("%d\n",*(p-1))
<5> 数组求最值
void min_arr_max(int *arr,int len)
{
int index=0;
for(int i=1;i<len;i++)
{
if(arr[i]>arr[index])
{
index=i;
}
}
printf("%d",arr[index]);
}
int main()
{
int arr[10]={5,1,6,7,2,0,8,4,3,9};
int len=sizeof(arr)/sizeof(int);
min_arr_max(arr,len);
getchar();
return 0;
}
2、二维数组
<1> 二维数组名
除了两种特殊情况外 ,二维数组名是 指向第一个一维数组 的 数组指针
(1) sizeof(二维数组名); //整个二维数组所占字节数
sizeof(指针); //指针类型所占字节数:4字节(任意类型指针)
(2) &(二维数组名); //获取的是二维数组的 数组指针 偏移量=一个二维数组
int arr2[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int *p=&arr;
&arr+1; //偏移一个二维数组
<2> 二维数组定义—初始化
(1) int arr[3][3]={
{1,2,3},
{4,5,6},
{7,8,9}}; //可读性高
(2) int arr[3][3]={1,2,3,4,5,6,7,8,9};
(3) int arr[][3]={1,2,3,4,5,6,7,8,9}; //可省略行值
(4) int arr[3][3]={1,2,3,4,5}; //按列值匹配,剩余位补0
(5) int arr[3][3]={{1,2},{1,2,3},{1}} //只对部分元素赋初值
(6) int arr[3][3] = { 0 }; //初始化全为0
<3> 访问二维数组元素
int arr[3][3]={
{1,2,3},
{4,5,6},
{7,8,9}};
//打印二维数组
for (size_t i = 0; i < 3; i++)
{
for (size_t j = 0; j < 3; j++)
{
printf("%d ", arr[i][j]);
}
putchar('\n');
}
//访问某个元素
printf("%d\n",arr[i][j]);
//等价于
printf("%d\n",*(*(arr+i)+j));
<4> 二维数组做函数参数
数组做函数参数是会被降级—等价于—一维数组指针
不能再函数内使用sizeof(数组名)来求数组所占空间大小
void test(int arr[][3]);
//等价于
void test(int (*arr)[3]); // 二维数组 int arr[][3] <---等价---> 数组指针 int (*arr)[3]
//调用
test(arr);