5、数组

一、数组基础
1.数组的概念
数组是多个相同类型的元素组成的一个集合
(1)数组的类型:数组元素的类型(整型数组:里面的每个元素都是整型数据)
(2)数组的元素:每个位置存放的内容
(3)数组的长度:数组的元素个数
(4)下标:访问数组元素的时候,第几个元素

2.数组的定义
int arr1[5];
#include <stdio.h>

int main(int argc, char const argv[])
{
/
数组的定义 */
//<存储类型> [数据类型] 数组名[元素个数];
int arr1[5];
// int arr4[];//错误
// printf("%d\n", sizeof(arr1));

/* 数组的初始化 */
int arr2[5] = {1, 2, 3, 4, 5};
int arr3[] = {1, 2, 3, 4, 5};//可以
int arr5[5] = {1, 2, 3};
int arr6[5] = {0};
int arr7[5];
// printf("%d\n", sizeof(arr3));

/* 数组元素的访问 */
// arr1[5] = {1, 2, 3, 4, 5};错误
arr1[0] = 1;
arr1[1] = 2;
arr1[2] = 3;
arr1[3] = 4;
arr1[4] = 5;

// for (int i = 0; i < 5; ++i)
// {
//     arr1[i] = i+1;
// }

printf("arr6[4] = %d\n", arr6[4]);
/*printf("arr2[3] = %d\n", *(arr2+3));
printf("%p\n", arr2);
printf("%p\n", &arr2);*/

for (int i = 0; i < 5; ++i)
{
    arr7[i] = arr2[i];
}
for (int i = 0; i < 5; ++i)
{
    printf("arr7[%d] = %d\n", i, arr7[i]);
}

return 0;

}

3.数组元素的赋值和访问
下标访问:a[5]
如果数组有n个元素,那么下标访问只能是0 ~ n-1
(1)数组在初始化的时候,可以一次性给多个元素赋值
int arr2[5] = {1, 2, 3, 4, 5};
但是,一旦定义或初始化完,在数组使用过程中,不能一次性赋值,必须一个一个赋值
// arr1[5] = {1, 2, 3, 4, 5};错误
(2)[n]方括号里面的n
在定义语句的时候,表示数组有多少个元素
在以后的使用中,n代表下标(访问数组的第n个元素(0 到 元素个数n-1))

二、数组名的含义
数组名代表数组首元素的地址
a[n] =========== *(a+n)

但是使用sizeof(a)得到的是数组总的占用空间量。

数组名 a 代表首元素地址 (单位是以数组元素为单位的)
数组名取地址 &a 代表整个数组的地址 (单位是以整个数组为单位的)

三、二维数组
#include <stdio.h>

int main(int argc, char const *argv[])
{
int arr1[4];
/二维数组定义/
int arr2[2][4];
// int arr6[][];//错误
// int arr7[2][];//错误
// int arr8[][4];//错误

/*二维数组初始化*/
int arr3[2][4] = {{11, 22, 33, 44}, {55, 66, 77, 88}};
int arr4[2][4] = {11, 22, 33, 44, 55, 66, 77, 88};//可以
// int arr5[][] = {11, 22, 33, 44, 55, 66, 77, 88};//错误
// int arr5[][] = {{11, 22, 33, 44}, {55, 66, 77, 88}};//错误
int arr5[][4] = {11, 22, 33, 44, 55, 66, 77, 88};
// int arr9[2][] = {{1, 2, 3, 4}, {5, 6, 7, 8}};//错误
// printf("&arr3[0][3] = %p, &arr3[1][0] = %p\n", &arr3[0][3], &arr3[1][0]);
// int arr10[2][4] = {1, 2, 3, 4, 5, {6, 7, 8}};//有问题
// int arr10[2][4] = {1, 2, 3, {4, 5}, 6, {7, 8}};//有问题
// int arr11[3][2] = {{1, 2, 3}, {4, 5, 6}};//有问题

/*给数组元素赋值*/
/*printf("请输入二维数组的每个元素:\n");
for (int i = 0; i < 2; ++i)
{
    for (int j = 0; j < 4; ++j)
    {
        scanf("%d", &arr2[i][j]);
    }
}*/

/*二维数组元素访问*/
for (int i = 0; i < 2; ++i)
{
    for (int j = 0; j < 4; ++j)
    {
        printf("arr10[%d][%d] = %d\n", i, j, arr10[i][j]);
    }
}

return 0;

}

四、数组的传参(数组作为参数)
1.一维数组传参
// int sum(int *a);
// int sum(int a[]);

2.二维数组传参
#include <stdio.h>

/char型二维数组的传参/
void display1(char (*p)[20])
{
printf("=display1==\n");
for (int i = 0; i < 4; ++i)
{
printf("%c\n", p[0][2]);
}
}

void display2(char p[][20])
{
printf("=display2==\n");
for (int i = 0; i < 4; ++i)
{
printf("%s\n", p[i]);
}
}

/每个元素都是char型指针的一维数组的传参/
void display3(char **p)
{
printf("=display3==\n");
for (int i = 0; i < 4; ++i)
{
// printf("%s\n", *(p+i));
printf("%s\n", p[i]);
}
}

void display4(char *p[])
{
printf("=display4==\n");
for (int i = 0; i < 4; ++i)
{
// printf("%s\n", *(p+i));
printf("%s\n", p[i]);
}
}

int main(int argc, char const *argv[])
{
char name1[][20] = {“zhangsan”,“lisi”,“wangwu”,“zhaoliu”};
char *name2[] = {“zhangsan”,“lisi”,“wangwu”,“zhaoliu”};

display1(name1);
display2(name1);

display3(name2);
display4(name2);

return 0;

}

五、函数指针数组
/*
整型数组:
就是一个数组
这个数组的每个元素是一个整型值
*/

/*
函数地址数组:
就是一个数组,
这个数组的每个元素是一个地址,
这种地址是一种函数的入口地址,
这种函数是一种返回值为double类型,两个double类型的形参的函数
*/
#include <stdio.h>
int main(int argc, char const *argv[])
{
int arr[4][5] = {{1,2,3,4,5},
{6,7,8,9,0},
{1,2,3,4,5},
{6,7,8,9,0}};

//首元素地址,类型:int [5]有5个整型元素的数组
//arr是一个拥有5个整型元素的数组的起始地址
//arr[0]的地址: &arr[0]
printf("%p\n", arr);//arr步长:20
printf("%p\n", arr+1);

//解引用:*(&arr[0])
//相当于arr[0][0]的地址:&(arr[0][0])
printf("%d\n", *arr);//*arr步长:4
printf("%p\n", *arr+1);

//整个数组的地址
printf("%p\n", &arr);//&arr步长:80
printf("%p\n", &arr+1);

// printf("%d\n", sizeof(*(arr)));
// printf("%d\n", sizeof(*(*arr)));
// printf("%d\n", sizeof(*(&arr)));

/*
int arr1[3] = {1, 2, 3};
arr1:数组首元素的地址,类型:int
*arr1:首元素的值:1
&arr1:整个数组的起始地址
*/

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值