首页 > 编程语言 > 详细

C语言数组

时间:2021-08-05 22:24:46      阅读:25      评论:0      收藏:0      [点我收藏+]

1、简单概述

数组是同种数据类型组成的集合,也可以说是同种数据类型变量的集合。数组是集合的一种,我们获取得到集合,就可以来操作集合中的变量。

数组的内存空间地址是连续的,数据类型必须都相同,如果不相同就不符合定义。

2、操作

首先先定义一个数组。数组的初始化分为完全初始化和部分初始化以及不初始化

// 完全初始化
int a[5] = {1,2,3,4,5};
// 部分初始化
int b[5]= {1,2};
// 不初始化,不进行初始化,里面全部都是垃圾值。
int c[5];

就拿最后一个不初始化来举例子:

# include <stdio.h>
int main(void){
	
	int a[4];
	for(int i = 0;i<4;i++){
		printf("对应的值是:%d\n",a[i]);
	}
	return 0;
}

下面进行正常的测试:

# include <stdio.h>
int main(void){
	
	int a[4] = {1,2,3};
	// int[3] b = {3,4,5};
	printf("a对应的值是:%d\n",a);
	printf("a[0]对应的值是:%d\n",a[0]);
	printf("a[1]对应的值是:%d\n",a[1]);
	printf("a[2]对应的值是:%d\n",a[2]);
	printf("a[3]对应的值是:%d\n",a[3]);
	printf("a[4]对应的值是:%d\n",a[4]);
	return 0;
}

直接看控制台输出:

a对应的值是:6487568
a[0]对应的值是:1
a[1]对应的值是:2
a[2]对应的值是:3
a[3]对应的值是:0
a[4]对应的值是:10687360

--------------------------------
Process exited after 0.1377 seconds with return value 0
请按任意键继续. . .

问题1:a是什么?

这里有一个很诡异的现象,a输出的整型值是6487568,那么这个a是什么?

问题2:定义一个数组,长度是4,里面有4个元素,从下表0开始,a[0]、a[1]、a[2]、a[3]这四个元素,但是a[4]又是什么?

解决第一个问题:

a代表的是指向这个数组中第一个元素的地址,而不是这个地址里面存储的值。这个可以验证:

# include <stdio.h>
int main(void){
    // 我这里只是给数组中的三个元素进行了赋值,而没有对后面的元素进行赋值,那么默认初始化就是0
	int a[4] = {1,2,3};
	// int[3] b = {3,4,5};
	printf("a对应的值是:%d\n",a);
	printf("a[0]对应的值是:%d\n",&a[0]);
	return 0;
}

控制台输出:

a对应的值是:6487568
a[0]对应的值是:6487568

--------------------------------
Process exited after 0.1527 seconds with return value 0
请按任意键继续. . .

对a[0]取地址,可以看到a[0]当前所处的内存空间的地址值和a是一样的,那么就是说a和a[0]的地址是同一块空间。

解决第二个问题:

a[4]是什么?首先在分配内存的时候,OS只分配了一个数据,长度是4,元素只有:a[0]、a[1]、a[3]、a[3]这四个元素,对于a[4]来说,看看下面的实验:

# include <stdio.h>
int main(void){
	
	int a[4] = {1,2,3};
	// int[3] b = {3,4,5};
	printf("a对应的值是:%d\n",a);
	printf("a[0]对应的值是:%d\n",&a[0]);
	printf("a[1]对应的值是:%d\n",&a[1]);
	printf("a[2]对应的值是:%d\n",&a[2]);
	printf("a[3]对应的值是:%d\n",&a[3]);
	printf("a[4]对应的值是:%d\n",&a[4]);
    printf("a[4]对应的值是:%d\n",a[4]);
	return 0;
}

控制台输出:

a对应的值是:6487568
a[0]对应的值是:6487568
a[1]对应的值是:6487572
a[2]对应的值是:6487576
a[3]对应的值是:6487580
a[4]对应的值是:6487584
a[4]对应的值是:1774464

--------------------------------
Process exited after 0.1567 seconds with return value 0
请按任意键继续. . .

可以惊奇的发现,原来地址也是对应的+数据类型所占用的字节数。但是a[4]这块内存空间尽管存在,但是对应的是垃圾值,而不是默认值。

因为这块空间不属于数组的,所以这里没有进行初始化。

3、错误示例

错误示例一

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

编译都不会通过,因为首先进行了数组的声明定义,然后再进行赋值的时候,发现没有a[4],也可以说a[4]对应的内存空间里存放的是垃圾值。

数组中根本就不存在着a[4],更何况是赋值:

# include <stdio.h>
int main(void){
	
	int a[4];
	a[4]= 2;
	printf("a[4]对应的值是:%d\n",a[4]);
	return 0;
}

控制台直接输出错误,这里和上面对比,可以发现,如果在声明的时候进行了初始化,输出a[4]不会出现问题,但是先声明后赋值,就出现了问题。

所以从这里可以看出来,数组在C语言中就已经知道了数组的长度,因为在定义的时候就已经指明了。

错误示例二

最经典的一种方式就是数组进行赋值,如:将数组a赋值给数组b,也就是说将a数组中的值都赋值给b数组中的元素;

# include <stdio.h>
int main(void){
	
	int a[4] ={1,2};
	int b[] = {};
	b = a;
	for(int i = 0; i<4;i++){
		printf("b中元素的值是:%d\n",b[i]);
	}
	return 0;
}

编译不会通过,那么使用下一个方式:

# include <stdio.h>
int main(void){
	
	int a[4] ={1,2};
	int b[] = {};
	// b = a;
	for(int i = 0; i<4;i++){
		b[i] = a[i];
		printf("b中元素的值是:%d\n",b[i]);
	}
	return 0;
}

查看控制台输出

b中元素的值是:1
b中元素的值是:2
b中元素的值是:0
b中元素的值是:0

--------------------------------
Process exited after 0.4152 seconds with return value 0
请按任意键继续. . .

赋值成功。

4、数组操作

数组中的操作:添加、删除、移动、遍历、最值问题,但是其他语言实现的时候,都会有对应的工具包来进行操作这些数组。我们只需要来操作这些工具类即可来进行操作数组了。

5、二维数组

先甩出来一个二维数组:int a【3】【4】,那么对应的数据就有3*4=12个,有十二个数据

a[0][0] a[0][1] a[0][2] a[][3]
a[1][0] a[1][1] a[1][2] a[1][3] 
a[2][0] a[2][1] a[2][2] a[2][3] 
a[3][0] a[3][1] a[3][2] a[3][3]     

所以从上面观察可以看出来,a【m】【n】代表的是第(m+1)行第(n+1)列的值;

那么int a【m】【n】这个定义说明了,二维数组的最后一个值是a【m-1】【n-1】

二维数组的空间结构:

我觉得就是一个一维数组中嵌套了一个一维数组,行或者是列中存储的是一个数组的首地址的值。

二维数组的初始化:

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

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

C语言数组

原文:https://www.cnblogs.com/likeguang/p/15104787.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!