变量的本质
内存的别名。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int a;
a = 10;
printf("&a :%d\n",&a);//6422044
*((int *)6422044) = 100;
printf("a :%d\n",a);//6422044
}
运行结果结果
内存四区
栈区:程序局部变量区。
堆区:Malloc/new free/delete,操作系统管理
全局区:常量和全局变量,操作系统管理
代码区:操作系统管理
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *getStr1()
{
char *p1 = "abcdefg";
return p1;
}
char *getStr2()
{
char *p2 = "abcdefg2";
return p2;
}
int main()
{
char *p1 = NULL;
char *p2 = NULL;
p1 = getStr1();
p2 = getStr2();
//打印p1 p2内存空间的数据
printf("p1 :%s, p2 :%s\n",p1,p2);
//打印p1 p2的值
printf("p1 :%d, p2 :%d\n",p1,p2);
}
运行结果
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *getStr1()
{
char *p1 = "abcdefg2";
return p1;
}
char *getStr2()
{
char *p2 = "abcdefg2";
return p2;
}
int main()
{
char *p1 = NULL;
char *p2 = NULL;
p1 = getStr1();
p2 = getStr2();
//打印p1 p2内存空间的数据
printf("p1 :%s, p2 :%s\n",p1,p2);
//打印p1 p2的值
printf("p1 :%d, p2 :%d\n",p1,p2);
}
运行结果:
当相同的时候 p1 和 p2 指向同一个内存空间,因为c++会做代码优化。
栈区和堆区的理解
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *getMem(int num)
{
char *p1 =NULL;
p1 = (char*)malloc(sizeof(char)*num);
if(p1==NULL)
{
return NULL;
}
return p1;
}
int main()
{
char *tem = NULL;
tem = getMem(10);
if(tem ==NULL)
{
return 0;
}
strcpy(tem,"111222");
printf("%s\n",tem);
}
运行结果:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *getMem(int num)
{
char *p1 =NULL;
p1 = (char*)malloc(sizeof(char)*num);
if(p1==NULL)
{
return NULL;
}
return p1;
}
char *getMem2()
{
char buf[64];//临时变量,栈区存放
strcpy(buf,"123456");
printf("buf:%s\n",buf);
return buf;
}
int main()
{
char *tem = NULL;
tem = getMem(10);
if(tem ==NULL)
{
return 0;
}
strcpy(tem,"111222");
tem =getMem2();
printf("tem:%s\n",tem);
}
注意:return不是吧内存块64个字节,给return出来而是把内存块的首地址(内存的标号0xaa11)返回给tem;
理解指针的关键是在内存,没有内存哪里的指针。
运行结果: