学C笔记归纳 第十五篇——二维数组

发布时间 2023-12-17 11:27:57作者: 王小龙s
 //二维数组创建
int arr[3][3];
char arr[5][10];
double arr[2][4];



 //二维数组初始化

int arr[3][4] = {1,2,3,4,5};
 //{1 2 3 4}
   {5 0 0 0}
   {0 0 0 0} 

int arr[3][4] = {{1,2},{4,5}};
 //{1 2 0 0}
   {4 5 0 0}
   {0 0 0 0}

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

 //二维数组如果有初始化,行可以省略,列不能省略
 //通过列数我们可以确定行数

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int arr[3][4] = { 1,2,3,4,5,6,7,8,9 };
    //打印数组每个元素的地址
    int i = 0;
    for (i = 0; i < 3; i++)
    {
        int j = 0;
        for (j = 0; j < 4; j++)
        {
            printf("arr[%d][%d] = %d   ", i,j,arr[i][j]);
            printf("&arr[%d][%d] = %p\n", i, j & arr[i][j]);
        }
    }
    return 0;
}

调试过程找不到错,重新捋一遍,发现少加了 逗号。

 

 

 

 

观察这串地址,发现二维数组在内存中也是连续存储的。

arr[ ]  [2], 我们可以将它当作一维数组的数组

数组越界:

#include <stdio.h>
int main()
{
 int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int i = 0;
    for(i=0; i<=10; i++)
   {
        printf("%d\n", arr[i]);//当i等于10的时候,越界访问了
   }
 return 0;
}

 

 

 
 

 数组越界 编译器是不会报错的,需要我们在写代码时自己注意。

二维数组越界一点还是会正常打印,多了打印也会错,敲代码时注意。

 

数组传参时,传的是首元素的地址。

#include <stdio.h>
int main()
{
    int arr[10] = { 1,2,3,4,5 };
    printf("%p\n", arr);
    printf("%p\n", &arr[0]);

    printf("%p\n", &arr);

    printf("%d\n", *arr);
    
    printf("%d\n", sizeof(arr));
    return 0;
}

 

 

 

 

 数组名确实能表示首元素的地址,,二维数组的数组名表示第一行一维数组的地址

但是有两个例外:

1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节

2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址

#include <stdio.h>
int main()
{
    int arr[10] = { 1,2,3,4,5 };
    printf("%p\n", arr); //arr 就是首元素的地址
    printf("%p\n", arr+1);
    printf("-------------------\n");

    printf("%p\n", &arr[0]); //首元素的地址
    printf("%p\n", &arr[0]+1);
    printf("------------------\n");

    printf("%p\n", &arr);
    printf("%p\n", &arr +1); //注意这个加一,跳过了一整个数组的字节 0x28


    /*printf("%d\n", *arr);
    printf("%d\n", sizeof(arr));*/
    return 0;
}

16进制 0x28 转十进制,32+8 = 40,就是数组arr[10]所占内存,40个字节。

 

 

 

 

#include <stdio.h>
int main()
{
    int arr[3][4];
    printf("%p\n", arr); //arr 就是首行一维数组的地址
    printf("%p\n", arr+1);
    return 0;
}

 

0x10 ,16个字节,16=4*4,一行4个元素

 

 

 

#include <stdio.h>
int main()
{
    int arr[3][4];
    //行数 3
    printf("%d\n", sizeof(arr) / sizeof(arr[0])); // 48/16

    //列数 4
    printf("%d\n", sizeof(arr[0]) / sizeof(arr[0][0])); // 16/4
    return 0;
}