目录
1级指针内存模型的建立
如下,建立几个内存模型,
void main61()
{
char buf[20]= "aaaa"; //定义并且初始化
char buf2[] = "bbbb";
char *p1 = "111111";
char *p2 = malloc(100);
strcpy(p2, "3333");
system("pause");
return ;
}
画出对应的内存示意图(要想理解好指针,必须理解好内存),
此处想要补充一点的是,以buf2为例,buf2里面的值“bbbb”是放在全局区不假,但栈区也是要给buf2分配了5个单位(四个b+1个“\0”)的内存空间,在栈区分配的5个单位内存,每个单位依次对应的是第一个"b",第二个“b”,第三个,第四个,。。。。。,而buf2这个变量本身所存的是第一个"b"的地址,即整个数组的首地址。这也是数组数据类型和其他数据类型的区别。(数组的长度: (该类型的长度 * 数组的长度 ))
再总结一下:
1.数组数据类型长度是根据该类型的长度 * 数组的长度而定的
2.数组变量本身代表的是数组的首地址,而并非所有数组。
3.数组变量在栈区开的内存中存放的是对应的元素值,不是元素的地址。这点很重要。
另外,以程序中的p2再复习一下,内存空间的分配,首先,要明白的是," char *p2 = malloc(100); "这条意味着,再堆区开了100单位的大小的内存空间,并且,p2作为一个指针变量,它保存这个内存空间的地址(即指向它)。而且,"strcpy(p2, "3333");",是先在全局区开辟一块儿区域放“3333”,再把这块儿区域的内容拷贝给p2指向的在堆区的那块儿地址里,不是拷到p2在栈区的变量所占用的空间下面。这点要区分清楚!
注,全局区是个中转站,把字符常量先存下来,凡是"****",都是先存字符常量,再继续后面的操作,都需要占内存的。
程序员牢记:概念不清晰是产生bug的根源
总体代码
dm06_一级指针内存模型建立.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
void main61()
{
char buf[20]= "aaaa"; //定义并且初始化
char buf2[] = "bbbb";
char *p1 = "111111";
char *p2 = malloc(100);
strcpy(p2, "3333");
system("pause");
return ;
}