C语言中数组的低阶使用(1)

1.一维数组

1.1一维数组的创建

type  name [const] //这是数组的表现形式
//type是数组的类型,可能是int,double,char类型等等
//name是数组名称,可以输入一个与项目相关的名称,后期好辩认
//const在[]内,表示数组的大小,一般是常量

上面提到了const一般是常量,但如果我们按照下面的这样写,可以吗?

//例1
int a = 10;
int b[a];//此处[]内是变量
//例2
int b[10];
//它们表示的含义是一样的,但是例1是变长数组,仅在c99标准下支持,常用的vs是不支持变长数组
//但是常用的刷题网站力扣,牛客是支持c99标准的

注释:变长数组是数组大小待定的数组,C语言中结构体的最后一个元素可以是大小未知的数组

1.2一维数组初始化

数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值

int a[5]={1,2,3,4,5};
//整形数组,元素有5个,分别是1,2,3,4,5(完全初始化)

int c[5]={1,2,3};
//整形数组,元素有5个,分别是1,2,3,0,0(不完全初始化)
//一般不完全初始化,后面的元素都由0来补全

int b[]={1,2,3,4,5,6,7,8,9};
//整型数组,元素个数未知,一般由初始化中内容确定
//此处元素是1-9,共九个,所以数组元素个数9

在字符数组初始化的时候有几个特别注意的

char a[3]={'a','b','c'};
//字符数组,元素个数3个,分别是a,b,c

char b[]={'a','b','c'};
//字符数组,元素个数未知,初始化成a,b,c,但不能确定个数,是个随机值
//因为字符的结束标志是"\0",这里只有'a''b''c',所以系统会从后面一直去找"\0",直到找到为止,从而计算a-\0
//共有多少个元素,就确定数组元素个数

char c[]={"abcdef"};
//字符数组,元素个数7个,a-f有六个元素,"\0"为一个,一共七个元素

1.3一维数组的使用

如何去使用数组中的每一个元素,如何将它们调出来,我们这里用到了这个操作符[ ],数组下标引用操作符,每一个数组的下标都是从0开始的,例如:

#include
int main()
{
   int a[5]={1,2,3,4,5};
   int i=0;
   for(i=0;i<5;i++)
   {
     printf("%d ",arr[i]);  //i从0开始打印一直到4,一共访问了数组5个元素,
   }                        //正好将数组全部元素都访问并且打印出来了
   return 0;
}
//试想一下,如果数组为int a[]={1,5,9,8,2,4,6,7},不知道元素个数是多少?for循环中的i应该怎么限定?
//方法如下:
//应用关键字sizeof计算数组大小(记住sizeof是关键字,不是库函数,后面有用)
#include
int main()
{
   int a[]={1,5,9,8,2,4,6,7};
   int sz=sizeof(a)/sizeof(a[0])
   //sizeof(a)//整个数组的大小
   //sizeof(a[0])//数组一个元素的大小
   int i=0;
   for(i=0;i

1.4一维数组在内存中的存储

一维数组在内存中的存储是连续的,且内存地址是由低到高存放的,我们用一段代码来证明一下

#include
int main()
{
	int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(a) / sizeof(a[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("&a[%d]=%p\n", i, &a[i]);
	}
	return 0;
}

ctrl+f5看结果

C语言中数组的低阶使用(1)_第1张图片结果验证了两个结论,数组元素是连续存放,每个间隔四个字节,且数组元素存储是从低地址到高地址。

2.二维数组

2.1二维数组的创建

type name [const1] [const2]
//type 数组类型
//name 数组名称
//const1 二维数组的行
//const2 二维数组的列

int a[3][5];
//整形二维数组,3行5列共15个元素

2.2二维数组初始化

int a[3][5]={1,2,3,4};
int b[][5]={1,2,3,4,5,6,7,8,9};
//在数组初始化的时候,可以省略行,但不可以省略列
//因为省略就不能体现出它是个二维数组
//所以下面两组二维数组,初始化是错误的
int c[][]={1,2,3,4,5,6};
int d[3][]={1,2,3,4,5,6};

 2.3二维数组的使用

二维数组和一维数组使用方法基本一致,我们看一段代码,即可了解

代码如下:

#include 
int main()
{
   int arr[3][4] = {0};
   int i = 0;
   for(i=0; i<3; i++) //此处循环的是行
   {
      int j = 0;
      for(j=0; j<4; j++) //此处循环的是列
      {
         arr[i][j] = i*4+j;

      }
 }
   for(i=0; i<3; i++)
   {
       int j = 0;
       for(j=0; j<4; j++)
       {
          printf("%d ", arr[i][j]);
       }
  }
         return 0;
}

2.4二维数组在内存中储存

跟一维数组一样,在内存也是连续存放的,我们写一段代码,并查看他的结果

代码如下:

int main()
{
	int arr[3][4];
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 4; j++)
		{
			printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
		}
	}
	return 0;
}

从结果可以看出1行和2行的地址是相连的,两两元素都是差4个字节,并没有说跨行了就差很多。

3.数组越界

正常的数组下标是有限制的,数组有n个元素,数组下标小于0或者大于n-1,此时数组就会越界访问,越界访问不会引起编译器错误,甚至不影响运行,但是数组越界是错误现象,在某些时候是会出错的,所以我们要合理使用数组,不要越界

你可能感兴趣的:(c语言,c++,算法)