天天看点

C语言中的数组

今天来梳理一下数组的相关知识

数组:

先来看一下数组的形式:

int  arr1[10];
char arr2[10];
double arr3[15];
           

这些都是定义的一些数组,有存放整形的数组,存放字符的数组等;

注意在创建数组的时候[ ] 中应为一个常量,不能使用变量。

常见的给数组赋值如下:

int arr1[10] = {1,2,3}; 
int arr3[5] = {1,2,3,4,5};
char arr5[5] = {'a','b','c'}; 
char arr6[10] = "abcdef";
           
注:1.一般数组的大小,应大于等于所存放进去的元素个数,而字符数组是以 \0 结尾的应注意 \0 ,在计算字符数组长度时记得 -1;

一维数组

之提到过 [ ],下标引用操作符。它其实就数组访问的操作符, 一维数组的使用就是通过 [ ]下标的方式;

先来看一段代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	int arr[10]={0};//数组的简单初始化
	int i;
	int len=sizeof(arr)/sizeof(int);//计算数组的长度大小
	for(i=0; i<len; i++)//数组下标从0开始
	{
	    arr[i]=i;//赋值
		printf("%d\n",arr[i]);
	}
	system("pause");
	return 0;
}
           

来看结果:

C语言中的数组
那么从本质上来讲 [ ] 其实就是对数组的解引用,比如给arr [0] 的位置上赋值0;实际上是先对数组arr[ 0] 位置的解引用访问,让后把0 放进去,解引用还有一个常见的 * 这个解引用操作符

那么数组又是如何存储的呢?看一段代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	 int arr[10] = {0};   
	 int i = 0;  
	 for(i=0;
	 i<sizeof(arr)/sizeof(arr[0]); ++i)   
	 {       
		 printf("&arr[%d] = %p\n", i, &arr[i]);  
	 }
	system("pause");
	return 0;
}
           

打印结果如下:

C语言中的数组

可以从地址上看到我们定义的整数数组在内存中是连续存储的,一个整形的变量一个元素占4个字节的大小,也同时说明了数组在内存中是连续存放的。

二维数组

先来看以下二维数组的例子:

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

           

和一维数组一样二维数组也是通过 [ ] 下标的方式使用,具体来看几个例子。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	 int arr[3][4] = {0};   
	 int i,j;
	 for(i=0; i<3; i++)
	 {
		 int j=0;
		 for(j=0; j<4; j++)
		 {
			 arr[i][j]=i*j; 
		 }
	 }
	  for(i=0; i<3; i++)   
	  {      
		  int j = 0;       
		  for(j=0; j<4; j++)    
		  {          
			  printf("%d", arr[i][j]);    
		  } 
		  printf("\n");
	  }    	  
	system("pause");
	return 0;
}
           

看运行结果:

C语言中的数组

可以看到打印的是一个三行四列的二维数组,

从逻辑上来说这是一个三行四列的二维数组,但实际上二维数组就是三行的一维数组组合而来的,可以用上面的来验证一维数组元素地址的方法来验证。

另外这里讲一下数组传参所需要的注意的地方:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void  display1(int *arr1,int len1 )//也可以是int arr1[]
{                        //当为一维数组的时候[]里的数字可有可无
	int i;
    for(i=0; i<len1; i++)
	{
		printf("%d ",arr1[i]);
	}
}
void  display2(int arr2[3][3])//总结:二维数组传参,函数形参的设计只能省略第一个[]的数字。
{	//因为对一个二维数组,可以不知道有多少行,但是必须知道一行多少元素。
	int i;
	for(i=0; i<3; i++)
	{
		int j=0;
		for(j=0; j<3; j++)
		{
			printf("%d",arr2[i][j]);
		}
		printf("\n");
	}
}
int main()
{
	int arr1[2]={1,2};
	int arr2[3][3]={1,2,3,4,5,6,7,8,9};
	int len1;
	len1=sizeof(arr1)/sizeof(arr1[0]);
	display1(arr1,len1);
	printf("\n");
	display2(arr2);
	system("pause");
	return 0;
}


           

运行结果如下:

C语言中的数组

另外在传参的时候注意只是传过去数组首元素的地址,因此如果传过程中用到数组的长度应该提前计算好之后传过去;

继续阅读