数组

本文详细介绍了数组的概念,包括一维数组的定义、赋值和使用,强调了初始化的不同方式。此外,还探讨了二维数组和多维数组的表示与操作。对于传统数组的局限性,文章提到了动态数组的概念,通过malloc函数实现动态内存分配,并对比了静态内存和动态内存的区别。最后,通过示例展示了动态数组的创建和释放,以及输出数组的方法。
摘要由CSDN通过智能技术生成

首先,我们学习一样东西一定要知道它的用途,我们为什么要学习数组,因为它可以解决大量同类型数据的储存和使用问题

一维数组

什么是一维数组

  1. 连续为多个变量分配存储空间
  2. 数组内所有变量的数据类型相同
  3. 所有变量所占的字节数相同

数组定义和赋值

int a[3] = {1,2,3};

注意:
a是数组名,其中数组名a代表该数组中首个元素a[0]的地址。3是数组元素的个数,1,2,3是分别用来给a[0],a[1],a[2]赋初值的,而[]里面的东西叫下标

特别注意的:

int a[3] = {1,2,3};
//正确
 
int a[3];
a[3] = {1,2,3};
//错误 

只有在定义数组的时候,才能对整体赋值
要想先定义再赋值,则需要一个个赋值,如:

int a[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
//正确 

数组使用问题

关于初始化

(1)完全初始化

int a[5]=12345;

(2)不完全初始化

int a[5]=123;

默认未初始化的元素的值为0

验证小例子:

#include <stdio.h>
int main (void)
{
	int a[5] = {1, 2, 3};
	printf ("a[4] = %d", a[4]);
}
//结果: a[4] = 0
小习题

(1)题目:如何将数组a中元素的值一一复制给数组b
答案:

# include <stdio.h>
int main (void)
{
	int i;
	int a[4] = {0,1,2,3};
	int b[4];
	for (i = 0; i < 4; i++)
	{
		b[i] = a[i];
	}
}

(2)题目:如何输出一维数组
答案:

# include <stdio.h>
int main (void)
{
	int i;
	int a[4] = {0,1,2,3};
    for (i = 0; i < 4; i++)
    {
    	printf ("a[%d] = %d\n",i, a[i]);
	}
}
/*结果: 
a[0] = 0
a[1] = 1
a[2] = 2
a[3] = 3
*/ 

二维数组

int a[2][3];
该数组有六个元素,可用两行三列来表示,他们分别为
a[0][0] , a[0][1], a[0][2]
a[1][0] , a[1][1] , a[1][2]

小习题

题目:如何输出二维数组
答案:

#include <stdio.h>
int main (void)
{
	int a[2][3] = {0,1,2,3,4,5};
	int i, j;
	for (i = 0; i < 2; i++)
	{
		for (j = 0; j < 3; j++)
		{
			printf ("%-5d", a[i][j]);
		}
	}
}
//结果: 0    1    2    3    4    5

-使得输出的数左对齐,5使得输出的每个数之间差五个空格数量

多维数组

n维数组可以看作是一个1维数组,它所包含的每个元素都是n-1维的数组

例如:int a[3][4][5];
该数组可以看作是含有三个元素的1维数组,而每个元素又包含4行5列的二维数组

传统数组(也叫静态数组)

传统数组的缺点:
1.数组的长度必须事先确定,只能定义为常整数,不能是变量
2.数组的长度一旦定义,就不能再更改
3.传统形式定义的数组,程序员无法手动释放内存,只有当函数运行完毕后,才能由系统自动释放数组的内存

动态数组

动态数组很好解决了传统数组的缺陷
动态的构造一维数组需要用到malloc函数

malloc函数的简单介绍

malloc函数的作用:让系统为本程序分配字节,并返回首个字节的地址

注意:
1.使用malloc函数要添加malloc.h头文件
2.malloc函数的形参只有一个,而且必须是整数,该整数表示要分配的字节数

#include <malloc.h>

int main (void)
{
	int i;
//i变量所占内存是静态分配的
    int* p = (int*) malloc (sizeof (int));
//sizeof(数据类型)或sizeof(变量名),可以返回该数据类型或该变量所占的字节数
//malloc (sizeof (int))是向系统申请分配大小为4的内存地址
//(int*)是强制类型转换,将这个地址转化为int*类型
//p变量所占内存是静态分配的,而它所指向的内存是动态分配的
    free (p);
//把p所指向的内存给释放掉,而p本身的内存是静态分配的,只能由系统自动释放 
}

动态的构造一维数组

# include <stdio.h>
# include <malloc.h>
 
int main (void)
{
	int len;
	printf ("请输入数组的长度: ");
    scanf ("%d", &len);
    int * parr = (int *) malloc (4 * len);
//这样动态的构造了一维数组,该数组类似于静态数组int parr[len];
}

动态内存和静态内存的比较

动态内存是由程序员手动分配和释放的,是在堆中分配的
静态内存是由系统自动分配和释放的,是在栈中分配的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值