11月22日——11月28日学习总结

这篇博客详细介绍了数组这一重要的数据结构,包括为什么需要数组、数组的分类(一维、二维和多维)以及如何定义和初始化它们。文章通过实例展示了数组的初始化、赋值、倒置、排序等操作,并指出了常见的错误用法。此外,还讲解了二维数组的表示方法和多维数组的遍历。内容深入浅出,适合初学者理解掌握C语言中的数组概念和操作技巧。
摘要由CSDN通过智能技术生成

五、数组

<1>为什么需要数组

为解决大量同类型数据的储存和使用

<2>数组的分类

*一维数组

*二维数组

*多维数组

【简单数组的初始化】

#include<stdio.h>
int main()
{
	int a[5]={1,2,3,4,5};//a是数组的名字,是第一个元素的地址,5表示数组元素的个数 
                         //并且这5个元素分别用a[0],a[1],a[2],a[3],a[4]来表示
	int i;
	for(i=0;i<5;++i)
    	printf("%d\n",a[i]);
	return 0;
}

<3>一维数组

*怎样定义一维数组

为n个变量连续分配存储空间

所有变量的数据类型必须相同

所有变量所占的字节大小必需相等

eg:int a【5】;

*有关一维数组的操作

1、初始化

完全初始化:int a【5】={1,2,3,4,5};

不完全初始化:int a[5]={1,2,3};

不初始化:所有的元素是垃圾值

清零:int a[5]={0};

2、赋值

/*#include<stdio.h>
int main()
{
	int a[5];
	scanf("%d",&a[0]);
	printf("%d\n",a[0]);
	return 0;
}*/
/*#include <stdio.h>
int main()
{
    int i;
    
    int a[10] = {0};
    for(i=0;i<10;i++)
    {
         scanf("%d",&a[i]);
    }
    for(i=0;i<10;i++)
    {
        printf("%d\n",a[i]);
    }
    return 0;
} */
#include <stdio.h>
int main()
{
    int i;
    int a[5];   // 数组名:a 是数组首元素的地址 -----相当于一个指针  是一个常量  
                //指针+整型值,表示地址的前移,前移的字节由指针指向的对象的类型决定
                //b+1;  前移4个字节(int型)
 
    printf("%#p\n",a);        //打印输出数组a的地址 相当于a[0]的地址
    printf("%#p\n",&a[0]);
    printf("%#p\n",a+1);
    printf("%#p\n",&a[1]);
    printf("%#p\n",a+2);
    printf("%#p\n",&a[2]);
 
    printf("请输入数组a元素的值:");
    for(i=0;i<5;i++)
    {
        scanf("%d",a+i);     //赋值给数组a
    }
    printf("a数组元素的值为:");
    for(i=0;i<5;i++)
    {
         printf("%d ",*(a+i));
    }
    return 0;
}
 
 

3、倒置【两种方法】

      设以数组A[],另设一数组B[],我们将A[]的元素倒序赋给B[],再将B[]顺序赋给A[],就完成了一组交换,这种方法比较直观,但我们还要在内存中划定一片区域给B[],有一定缺陷。

#include <stdio.h>
int main()
{
 int a[10],b[10];
 
 int i;
 
 for(i=0;i<10;i++)      //按0~9赋值一个数组//
 {
  a[i]=i;
 }
 for(i=0;i<10;i++)//将a[]倒序赋值给b[]
 {
  b[i]=a[9-i];
 }
 for(i=0;i<10;i++)//再换过来//
 {
  a[i]=b[i];
 }
 for(i=0;i<10;i++)
 {
 printf("%d\n",a[i]);//打印//
 }
 return 0;
 
}

互换该数组内的前后元素,定义一个变量实现元素的互换

#include <stdio.h>
int main()
{
 int t, i;
 
 int a[10];
 
 for(i = 0;i < 10;i++)//我们定义一个数组并赋值为1~10//
 {
  a[i] = i;
  
 }
 for(i = 0;i <= 5;i++)//数组中下标和为9的两个元素互换,要换10/2=5次,若数组长度为奇数则为n/2-1次//
 {
  t = a[i];//进行互换//
  
  a[i] = a[9-i];
  
  a[9-i] = t;
  
  
 }
 for(i = 0;i < 10;i++)
 {
  printf("%-3d",a[i]);//打印结果//
 }

 
 return 0;
}


/*#include<stdio.h>
int main()
{
	int a[7]={1,2,3,4,5,6,7};
	int i,j;
	int t;
	i=0;
	j=6;
	while(i<j)
	{
		t=a[i];
		a[i]=a[j];
		a[j]=t;
		i++;
		j--;
	printf("%d\n",a[i]);		
	}

	return 0;
}*/

 4、排序【两种方法】

1.冒泡排序法:

#include<stdio.h>
 
int main ()
{
    int i,j;
    int temp;
    int array[10];
 
    printf("请输入10个整数:\n");
    for(i=0; i<10; i++)
    {
        printf("第 %d 个元素: ",i+1);
        scanf("%d",&array[i]);              
    }
 
    for(i=0; i<10; i++)
    {
        for(j=0; j<10-i-1; j++)
           {
                if(array[j] > array[j+1])    //相邻元素之间比较
                {                            //大的元素向右移动
                    temp = array[j]          //每一轮比较最大的元素在最后
                    array[j] = array[j+1]
                    array[j+1] = temp;
                }
            }
    }
 
 
printf("排序后的结果: \n");
for(i=0; i<10; i++)
{
    printf("%d",array[i]);
}
printf("\n");
return 0;
}


2.选择排序法:

#include<stdio.h>
 
int main( )
{
    int i, j = 0;
    int temp, array[10];
    printf("请输入10个整数:\n");
    for(i=0; i<10; i++)
    {
        printf("第 %d 个数: ",i+1);
        scanf("%d",array+i);
    }
 
    for(i=0; i<10-1; i++)
    {
    for(j=i+1; j<10; j++)              //10个元素选出最小的元素放在第一位
        {
         temp = array[i];           //在剩下9个元素中选出最小的放在第二位
        if (array[i] > array[j])   //以此类推
        { 
            array[i] = array[j];
            array[j] = temp;
        }
    }
    }  
    printf("排序过后的结果: \n");
    for(i=0; i<10; i++)
    {
    printf("%d\t",array[i]);
    }
}

5、错误写法

int a[5];
a[5]={1,2,3,4,5};
//错误 只有在定义数组的同时才可以整体赋值

int a[5]={1,2,3,4,5}
a[5]=100;//错误 因为没有a【5】这个元素

int a[5]={1,2,3,4,5}
int b[5];
b=a;//错误!!a,b不代表数组中所有的元素,他们是数组的名字,也代表数组中第一个元素的地址
//正确写法
for(i=0;i<5;++i)
    b[i]=a[i];

<4>二维数组

*eg:int a[3][4]

总共是12个元素,可以当做3行4列来看待

a[i][j]表示第i+1行,第j+1列的元素

int a[m][n]; 该二维数组最大位置的元素只能是a[m-1][n-1](右下角)

//可看做一个矩阵

*初始化

int [3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

int [3][4]={

                      {1,2,3,4}

                      {5,6,7,8}

                      {9,10,11,12}

              }

【输出数组内容】

#include<stdio.h>
int main()
{
	int a[0]; 
	int i;
	int j;
	for(i=0;i<3;++i)
	{
		for(j=0;j<4;++j)
		printf("%d ",a[i][j]);
	}
	return 0;
}

<5>多维数组

*多维数组的遍历

多维数组也是存在遍历的,和一维数组遍历一样,也是需要用到循环。不一样的就是多维数组需要采用嵌套循环,如:遍历输出int num[3][3] = {undefined{1,2,3},{4,5,6},{7,8,9}};

 *多维数组的定义

多维数组的初始化与一维数组的初始化类似也是分两种:

1、数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n] = {undefined{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};

2、数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n]; 数组名称[下标1][下标2]...[下标n] = 值;

多维数组初始化要注意以下事项:

1、采用第一种始化时数组声明必须指定列的维数。因为系统会根据数组中元素的总个数来分配空间,当知道元素总个数以及列的维数后,会直接计算出行的维数

2、采用第二种初始化时数组声明必须同时指定行和列的维数。

【注意:多维数组的每一维下标均不能越界!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值