C语言数组知识点总结

C语言数组

定义

  • 数组是用来存储一系列相同类型数据的集合

静态数组

  • 静态数组内存分配是连续的(即地址连续),最低的地址对应首元素,最高的地址对应末尾元素。在栈内存上分配了固定大小,在运行时这个大小不能改变。在函数执行完以后,系统自动销毁;
  int a[5] = {1,2,3,4,5};
或 int a[] = {1,2,3,4,5};//定义时地址分配完毕,数组长度固定
  • 定义一个静态数组实例
# include <stdio.h>
int main(void)
{
    int a[5] = {1, 2, 3, 4, 5};
    int i;
    for (i = 0; i < 5; i++ )
    {
        printf("%d\n", a[i]);
    }
    return 0;
}

动态数组

  • 动态数组的内存空间是从堆(heap)上分配(即动态分配)的,当程序执行到分配内存语句时,才为其分配存储空间。运行结束后,程序员需要free自行销毁释放分配的空间。
  • 定义一个动态数组实例
#include <stdio.h>
#include <stdlib.h> //使用malloc函数需要调用此头文件
	
int main()
{
    int Len;  //数组长度
    int *array;  //数组指针
    int i;  //数组下标

	//获取数组长度
    printf("请输入数组长度:");
    scanf("%d", &Len);
    
    //动态分配内存空间,如果失败就退出程序
    array = (int*)malloc( Len * sizeof(int) );
    if(array == null)
    {
	 	printf("内存分配失败!\n");
		exit(0); 
	}
    
    //向数组占用的内存写入数据
    for(i = 0; i < Len; i++ )
    {
        array[i] = i + 1;
    }
    
    // 遍历数组
    for(i = 0; i < Len; i++)
    {
        printf("%d  ", array[i]);
    }
	    
	printf("\n");
	free(array); //释放资源
    
    return 0;
}

一维数组

一维数组的声明

类型名 数组名[常量表达式];

例如:

int a[5];	// 注意为常量表达式 不能是变量

以上就是定义的一个长度为5的整型数组,方括号中的常量表达式为数组的元素个数(即数组长度),a为数组名,同时代表的数组的首元素地址

一维数组的初始化

  • 完全初始化:定义时给所有元素赋值

    int a[5] = {1, 2, 3, 4, 5};
    
  • 不完全初始化:定义时只给部分的元素赋值

    int a[5] = {1,2}
    

    这种方法只给部分的元素赋值,未赋初值的系统会为默认为其赋初值为0。

    注意:定义数组一定要为其赋初值,不能a[5] = {};,只有一个大括号,系统会随机为其赋垃圾值,会导致程序出现不必要的错误。

    大括号中最少要写一个数。比如:int a[5]={0};此时系统默认全部赋0值

  • 如果定义数组时就给数组中所有元素赋初值,那么就可以不指定数组的长度,因为此时元素的个数已经确定了。

    int a[] = {1,2,3,4,5};	
    // 不能直接定义 int a[] = {};而不给其赋初值
    

    以上形式自动会根据括号内元素生成长度,省去了我们自己去计算数组长度可能导致错误的情况。

访问数组元素

  • 数组元素可以通过数组名称加索引进行访问。元素的索引放在方括号内。
int a[5] = {1,2,3,4,5};
printf ( "%d\n" , a[3]);	// 输出的结果为4
  • 注意:数组中第一个索引值为 0;长度为n的数组,最后一个元素的索引值为n - 1,若输入a[n]则会报 “数组越界错误”
  • 也可以用指针访问数组,例:
#include <stdio.h>
 
int main()
{
   int a[5], i;
   printf("输入元素: ");
 	//循环输入数据
   for(i = 0; i < 5; ++i)
     scanf("%d", a + i);	//数组名代表首元素地址
 	//遍历数组
   printf("数组元素为: \n");
   for(i = 0; i < 5; ++i)
      printf("%d  ", *(a + i));
 
    printf("\n");
    
   return 0;
}

二维数组

  • 相当于一个一维数组的列表,声明一个 x 行 y 列的二维整型数组,如int a[2][3];相当于两个长度为3的一维数组;理解上可以将其视为x行y列的矩阵,但其内存是连续的。

二维数组的声明

类型名 数组名 [ x ][ y ]; 		//x表示行标,y表示l列标
  • 同样的 a为数组名,同时代表的数组的首元素地址

二维数组的初始化

// 二维数组可以通过在括号内为每行指定值来进行初始化
a[2][3] = {{1,2,3} , {4,5,6}};
//也可以去掉括号,等价
a[2][3] = {1,2,3,4,5,6};

二维数组的访问

  • 二维数组中的元素可以通过使用下标索引(行索引和列索引)来访问
#include <stdio.h>

int main()
{
	int a[2][3] = {1,2,3,4,5,6};
	printf("%d",a[1][2]); //输出结果为6
	
	return 0;
}
  • 也可以通过指针访问
#include <stdio.h>

int main()
{
   int a[2][3] = { { 1, 2, 3} , {4, 5, 6,} };
   int (*p)[3] = a; //定义数组指针执行数组
   int i, j;
   p = a;
   //遍历数组
   for (i = 0; i < 2; i++ )
   {
       for ( j = 0; j < 3; j++ )  printf("%d   " , *(*(p+i)+j));
   }
   
   printf ("\n");
   
   return 0;
}

多维数组

对于多维数组其实就是维度的推广,用法基本上差不多,学习了指针后,对于多维数组的运用可以应用指针来解决。

有错误欢迎指正,谢谢~

你可能感兴趣的:(C语言,c语言,数组)