1.学c笔记归纳 第二篇——基本数据类型2.学c笔记归纳 第三篇——常量3.学C笔记归纳 第四篇——static关键字(重点)4.学c笔记归纳 第五篇——指针(抽象点)5.学C笔记归纳 第六篇——结构体6.学C笔记归纳 第七篇——分支循环语句17.学C笔记归纳 第八篇——分支循环语句2_switch8.学C笔记归纳 第九篇——分支循环语句3_for_while_do while(附九九乘法表解析和三种方式实现)9.学C笔记归纳 第十篇——循环算法优化10.学C笔记归纳 第十一篇——函数111.学C笔记归纳 第十二篇——函数2 声明和定义12.学C笔记归纳 第十三篇——函数3 递归(重点)13.学C笔记归纳 第十四篇——一维数组
14.学C笔记归纳 第十五篇——二维数组
//二维数组创建
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 };
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;
}

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了