一维数组和二维数组的使用

一维数组

1. 一维数组的创建与初始化

数组的创建:

float arr[5];//5个浮点型的数组
int arr[120];//120个整型的数组
char arr[20];//20个字符型的数组

1、其中的[]是解引用操作符,它的操作数有两个:一个数组名+一个索引值。数组的创建一定要包括类型名,如上面代码的:float、int、char
2、[]内的数字是索引,从零开始计数。如“int arr[5]”arr[0]是首元素,arr[4]是第5个元素,也就是最后一个元素。
3、[]内只能放入常量,可以是数字、字符型常量、const修饰的常量。

4、[]内的数字必须大于零、数字只能是整型

5、数组名的命名只能由下划线、数字、字母组成,必须以下划线或字母开头。还要注意不能是关键字。

数组的初始化:

/*int arr[4] = {2,3,4,5,6,7}  错误的初始化,元素超过分配内存大小*/

int arr[4] = {2,3,5,6};//arr中放置了4个元素
int arr[4] = {2,3,4};//arr中放置了4个元素,其中arr[3]自动初始化为:0
int arr[] = {2,3,4,5};//arr自动初始化为4个整型空间的数组,分别赋值为:2,3,4,5
char arr[4] = {'a','b','c','d'};//arr初始化为字符型数组
char arr[] = "abc";//arr中储存了4个元素分别为'a','b','c','\0'('\0')是字符串结束标志

#include <stdio.h>
int arr[10] = {0};//利用循环初始化数组
int i = 0;
int main()
{
  for(i=0; i<10; i++)
  {
    arr[i] = i;  //arr[10]={0,1,2,3,4,5,6,7,8,9}
  }
  return 0;
}

//数组还可以指定元素下标进行特定的赋值
int arr[6] = {[4] = 5};//arr[4] = 5

2. 一维数组的使用

1、数组的调用不能够直接将数组中的元素全部输出,应该调用循环输出。

#include <stdio.h>
int i = 0;
int arr[3] = {2,3,4};
int main()
{
  /*printf("%d\n",arr[3]);  错误的输出方式*/
  for(i=0; i<3; i++)//正确的输出
  {
    printf("%d\n",arr[i]);
  }
  return 0;
}

2、其中数组的大小可以利用函数sizeof()求得,如:
int arr[10];
int Size = sizeof(arr)/sizeof(arr[0]);
//sizeof(arr)求的是整个数组的字节大小(10*4 = 40 byte),sizeof(arr[0])求的是数组首元素的字节大小(4 byte),计算的Size = 10

在函数进行数组传参的时候,Size的大小只能在main()中求解得到,函数中进行求解是不行的。因为传参的时候传递的只是数组的首元素的地址,用函数sizeof()求解时调用的只是首元素地址,得到的不是整个元素的大小。

3. 一维数组的存储

  数组在内存中是连续存储的,高索引号储存在高地址中,如:int arr[4],若arr[0]地址为0x00b6802c,则arr[4]的地址为0x00b6803c,其中跨过了4*4 = 16 byte。
这里写图片描述
  
监控窗口

4. 一维数组的指针访问

  用指针输出函数:

#include <stdio.h>

int arr[4] = {2,3,4,5};
int *p = arr;
int i = 0;
int main()
{
  for(i=0; i<4; i++)
  {
    printf("%d\n",*(p+i));/*指针变量p跟着for循环每次+1,将指针一次指向arr[0]、arr[1]、arr[2]、arr[3]*/
  }
  return 0;
}

监视窗口

语句(int *p = arr;)中p得到的是arr首元素的地址,在图中可以看到。


二维数组

1.二维数组的创建与初始化

  二维数组的创建与初始化和一维数组的创建与初始化有很多相似的地方,同样的要有类型名,数组名,解引用操作符。

#include <stdio.h>

int arr[3][4]; //创建一个3行4列的二维数组
int Arr[][]={{3,4},{5,6},{3,4,5}}; //创建了一个3行3列的二维数组,等同于Arr[3][3]
//Arr[][]中包含的元素分别是:3,4,0  5,6,0  3,4,5
int arr[][2]={{1,1},{2,2},{3,3}};  //创建了一个3行2列的二维数组,等同于arr[3][2]

//利用for循环创建二维数组
//对arr[4][4]赋值为1~16
#include <stdio.h>

int arr[4][4] = { 0 };
int i = 0;
int j = 0;
int count = 0;

int main()
{
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 4; j++)
        {
            arr[i][j] = (4*i+j+1);
            printf("arr[%d][%d]=%2d   ", i, j, arr[i][j]);
            count++;
            if (count%4 == 0)//四个元素输出就换行
            {
                printf("\n");
            }
        }
    }
    return 0;

for循环赋值

2.二维数组的存储

  二维数组的存储可以看成几个一维数组的连续存放,见下图:
二维数组的存储
  我们一般的想法是把二维数组看成是一个几行几列的矩阵,这种构思适合我们思考的时候使用,实际上就应该是连续存放。我们可以将第一个[]中的数字看成是第二个[]的个数,而第二个[]可以当成一维数组看待。如arr[2][3]就可以看成是两个三元素的一维数组连续存放。

3.二维数组的使用和指针访问

  二维数组的整体使用也是要调用for循环来使用,这点跟一维数组是一样的
  指针访问也是跟指针访问相似


数组的几个小点

1、arr(单只有一个数组名的时候)表示的是首元素的地址,即&arr[0]。所以当我们指arr[4]的时候,其实等价于*(arr+4),它的意思是:通过地址找到内存arr[0]所在,然后移动4个字节大小,取出对应的值。

2、当我们进行函数的定义或者声明的时候,如果函数需要调用数组,那么定义数组时候使用的 int arr[] 实际上等价于 int * arr,int arr[] 只是用来明显的让用户知道这里调用的是数组。

3、数组名 arr 代表整个数组只有两种情况:sizeof(arr) 和 &arr 这两种情况之外的数组名表示首元素arr[0]的地址

#include <stdio.h>

int arr[3] = {1,2,3};

int main()
{
  printf("%d\n", sizeof(arr));  //12  arr表示整个数组,所以求出了整个数组的字节数
  printf("%d\n", sizeof(&arr));  //4  &arr在sizeof()中,表示首元素地址arr[0]
  printf("%d\n", sizeof(arr+1));  //4  arr表示首元素地址arr[0] (arr+1) = arr[1]
  printf("%d\n", sizeof(arr[1]));  //4
  printf("%d\n",sizeof(&arr+1));   //4 (&arr+1)跳过了整个数组,地址在arr[2]后面
}



猜你喜欢

转载自blog.csdn.net/loved_computer/article/details/76020089
今日推荐