C语言数组

数组

由N个相同元素组成的一片连续的内存空间,通过下标运算符[n] 的方式去访问(0 <= n < N-1)。如果n >= N那么就会有可能出现越界的问题导致程序报错退出,如果你刚好越界的地址没有被其他程序使用,那就不会出错,但一旦是被使用的,那就会出错了,所以为了避免出错就不要越界。用指针的说法就是指针操作非法内存。

一维数组

一维数组即是只有一个[]组成的数组。

定义方式:类型 变量名[常量表达式];如int a[10]; int b[4+6];
定义时初始化:数组 = {}; 如int a[10] = {0,1,2,3};初始化个数不足长度的时候,后面的元素编译器会自动填0,所以等同于int a[10] = {0,1,2,3,0,0,0,0,0,0};
访问方式:下标访问。如int a[10] = {0,1,2,3};  int b = a[2];
赋值方式:下标访问赋值。如int a[10]; a[0] = 0; a[2] = 2;

二维数组

二维数组即是由两个[]组成的数组。可以理解成由N个一维数组组成。

定义方式:类型 变量名[常量表达式];如int a[2][10]; int b[2][4+6];
定义时初始化:数组 = {{},...}; 如int a[2][10] ={{0,1,2,3} ,{4,5,6}};初始化个数不足长度的时候,后面的元素编译器会自动填0
访问方式:下标访问。如int a[2][10] = {{0,1,2,3} ,{4,5,6}};  int b = a[1][2];
赋值方式:下标访问赋值。如int a[10]; a[0] = 0; a[2] = 2;

n维数组

不管是几维数组,都是由N个相同元素组成的一片连续的内存空间,定义成多维数组只是为了方便操作(不用自己算间距)和理解,最主要是方便理解。主要用一维、二维、三维数组,维数再大就难以理解了,因为我们大部分人都知道点(普通变量)、线(一维数组,X坐标轴)、面(二维数组,XY坐标轴)、立体(三维数组,XYZ坐标轴)。
如下例子:

#include <stdio.h>
int main(void)
{
	int linearArray[12] = { 0,1,2,3,4,5,6,7,8,9,10,11 };//一维数组,12个元素
	int _2DArray[3][4] = { {0,1,2,3} ,{4,5,6,7} ,{8,9,10,11}};//二维数组,3*4个元素
	int _3DArray[3][2][2] = {{{0,1},{2,3}} ,{{4,5},{6,7}} ,{{8,9},{10,11}}};//三维数组,3*2*2个元素

	printf("%p, %p, %p", linearArray, _2DArray, _3DArray);
	printf("\n%d, %d, %d", linearArray[6], _2DArray[1][2], _3DArray[1][1][0]);//下标:1x4+2 = 6。 1x4+1x2+0 = 6
	return 0;
}

在这里插入图片描述

其他用法

  1. 定义时靠近变量名的[]里面可以不写长度,但要初始化。
int a[] = {0,1,2,3},//a为一维数组,长度就为4。
//int c[];//这写法是错误。编译器会报错
int b[][5] = {{0} ,{1}};//b为二维数组,长度为10(2x5),等同于int b[2][5] = {{0,0,0,0,0} ,{1,0,0,0,0}};
//从上可以看出,[]不填长度,定义时就必须要把你要的长度的个数给初始化了
  1. 字符串,实际就是char数组。这篇文章有讲关于字符串的知识
void main()
{
	/**********************************************
	* 这是字符串的定义初始化方式。如果你要字符串长度就是初始化的长度,那可以不填,如果要自定义就填。
	* 但字符串长度不等同于数组长度。而且数组长度必须要>=字符串长度+1
	********************************************* /
	char str[10] = "cjz";//特殊的初始化方式,只有char数组支持这样的初始化方式。等同于char str[10] = {'c', 'j', 'z'};
	char s[] = "hello";//数组长度6,字符串长度5
	system("pause");
}
  1. 数组首地址。指针知识跳转
void main()
{
	int a[10] = { 0,1,2,3,4,5,6,7,8,9 };//a代表的是数组的首地址(首元素的地址),其类型是int *。
	//a的值等同于&a,等于&a[0],都是首地址,但其对应的类型不同,a和&a[0]都是int *,&a是int (*)[10]。如果只需要首地址,这三种方式都可以。
	//&a = 0; //&a其实是一个地址,类型是int (*)[10] , 地址是常量,常量是不能做左值的。比如数组a[10]的首地址是0x1234,那么&a就是代表0x1234,所以0x1234=0是不对的。
	//正确操作应该如下
	a[0] = 0

	int b[2][2] = {{0}};
	//b的值等同于&b,等于&b[0],等于&b[0][0],都是首地址,但其对应的类型不同,b和&b[0]是int (*)[2],&b是int (*)[2][2],&b[0][0]是int *。
	system("pause");
}
  1. 变长数组,并不是所有IDE(如VS并不支持)都支持这样的写法。不推荐这样使用,建议使用动态内存分配。
int n = 10;
int a[n];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值