数组

1、一维数组

<1> 一维数组名

在以下两种情况下数组名不是指向数组首元素的指针

1sizeof(数组名)      //数组所占字节数
    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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值