第二条军规:必须画图理解,内存布局
C语言是一门偏底层的语言,可以直接操作(访问)内存的,所以我们要清楚的知道,写出的代码所对应的内存布局。
内存布局的理解会帮助你理解更多的知识,才能理解的更加清楚一些,比如:局部变量创建在哪里、数组是怎么创建的,随着下标的增长地址是怎么变化的!、一堆数组、二维数组在内存中的布局是怎样的?、指针和内存的关系是啥?、指针和数组的关系是啥?、怎么通过指针访问数据?、怎么通过指针访问任意内存?、函数的调用逻辑、函数是怎么传递参数的?、实际参数和形式参数的关系是怎么样的?、函数调用的栈帧是怎么创建和销毁的?、函数递归是怎么调研的?、全局变量和静态变量还有动态内存开辟都是那些区域?、柔型数组是怎么样的?、可变参数是怎么实现的?
数组在内存中是这样存放的?答:连续存放的。在这里可以这样1,2,3,4,5,6,7,8,9,10。就这样放,这就是连续的空间,数组都是有下标的,下标都是从0开始的,那这个下标0就来第一位。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
//打印
//按照下标打印:下标为0~ 9
int i = 0;
//for循环
for (i = 0; i < 10; i++)
{
//我要打印它arr[i];让printf来打印
printf("%d",arr[i]);
}
//也能通过指针来访问。如何去做呢?
//说:数组名本来就是地址嘛!arr地址名其实就是我们第一个元素的地址。先把它放到指针里面去
int*p=arr;//这个地方我们给了一个指针p。变量p存了arr的地址。只要找到第一个,后面的位置都能找得到。如果空间是连续的,那后面都能找得到
int j = 0;
for (j = 0; j < 10; j++)
{
//打印变量p,利用指针指向的地址
printf("\n%d\n",*p);
//让p自增一次
p++;
}
return 0;
}