C语言——一维数组、二维数组

本文详细介绍了C语言中一维数组的定义、赋值、访问和数组传递,以及二维数组的定义、初始化方式,同时探讨了栈空间在Windows和Linux系统中的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、一维数组

1.1 数组定义

数组:一组具有相同数据类型的数据的有序集合。

一维数组的定义格式

类型说明符 数组名 [常量表达式]

例如:

int a[5];

定义一个整型数组,数组名为a,它有10个元素。

​ 数组声明需要遵循以下原则:

  1. 数组名的命名规则和变量名的相同,即标识符命名规则。
  2. 在定义数组是,需要指定数组元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。
  3. 常量表达式中可以包含常量和符号常量,但是不能包含变量。说白了,C语言不允许对数组的大小做动态定义,即数组的大小不依赖于程序运行过程中变量的值。

1.2 一维数组的赋值、访问、数组传递

  1. 在定义数组时对数组元素赋初值

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

  2. 给数组中一部分元素赋值

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

  3. 如果要使一个数组中全部元素的值为0,可以写为

    int a[5] = {0};

  4. 在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组的长度

    int a[] = {5,6,7,8,9};

例子如下:掌握数组的赋值、访问、数组传递

#include<stdio.h>
#include<stdlib.h>

void print(int b[], int len)
{
	int i;
	for ( i = 0; i < len; i++)
	{
		printf("%3d", b[i]);
	}
	b[4] = 20;//在子函数中修改数组元素
	printf('\n');
}


#define N 5
int main()
{
	int j = 10;
	int a[5] = { 1,2,3,4,5 };//定义数组时,长度必须固定
	int i = 3;
	a[5] = 20;//访问越界
	a[6] = 21;
	a[7] = 22;//越界访问会造成数据异常
	print(a, 5);
	printf("a[4]=%d\n", a[4]);//a[4]发生改变
	system("pause");
	return 0;
}

1.3 栈空间和数组

​ Windows操作系统中单个函数的栈空间大小是1MB,Linux操作系统中单个函数的栈空间大小时10MB(Linux操作系统下可以修改)。

例1. Windows中单个函数栈空间上限

#include<stdio.h>
#include<stdlib.h>

#define N 250000
int main()
{
	int arr[N] = { 0 };
	system("pause");
	return 0;
}

代码执行结果如下:

在这里插入图片描述

例2. Windows中单个函数栈空间访问越界

#include<stdio.h>
#include<stdlib.h>

#define N 260000	//超出单个函数的栈空间限制
int main()
{
	int arr[N] = { 0 };
	system("pause");
	return 0;
}

代码执行结果如下:

在这里插入图片描述

二、二维数组

2.1 二维数组的定义与引用

二维数组定义的一般形式如下:

类型说明符 数组名[常量表达式][常量表达式]

例如:

float a[3][4];

可以将二维数组视为一种特殊的一维数组:一个数组中的元素类型是一维数组的一维数组。

例如,可以把二维数组a[3][4]视为一个一维数组,它有3个元素a[0]、a[1]和a[2],每个元素又是一个包含4个元素的一维数组,如下图所示。

在这里插入图片描述

下图显示了二维数组a[3][4]中每个元素时的顺序。

在这里插入图片描述

2.2 二维数组的初始化及传递

  1. 分行给二维数组赋初值

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

  2. 将所有数据写在要给花括号内,按数组排列的顺序对各元素赋初值

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

  3. 对部分数组元素赋初值

    int a[3][4] = {{1},{5},{9}};

  4. 如果对全部元素赋初值,那么定义数组时可以不指定第一维的长度,但是要指定第二维的长度。例如,

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

    等价于

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

例子如下:掌握二维数组的赋值、访问、数组传递

#include<stdio.h>
#include<stdlib.h>

//二维数组的首地址,赋值给b
//行不能传递过去,列一定要写
void print(int b[][4], int row)
{
	int i, j;
	for ( i = 0; i < row; i++)//外层循环为行
	{
		for (j = 0; j < sizeof(b[0]) / sizeof(int); j++)//内层循环为列
		{
			printf("%3d", b[i][j]);
		}
		printf('\n');
	}
}
//二维数组的存储结构
//二维数组的传递
int main()
{
	int a[3][4] = { 1,3,5,7,2,4,6,8,9,11,13,15 };
	float b[4] = { 1,2,3,4 };
	int c[3][4] = { {1},{5,9} };//可以只对部分元素进行初始化
	print(a, 3);
	printf("a[2][3]=%d\n", a[2][3]);//打印最后面的一个元素
	system("pause");
	return 0;
}

执行结果如下:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值