why learn ?- the variable 's lifetime
- the stream to call the func
how c program run- os load the program into the memory
- c language div the memory to 4 piece (heap stack global codes)
- find the door main() and execute
global division
全局区的理解:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * getstr1()
{
char * p = "hello";
return p;
}
char * getstr2()
{
char * q = "hello";
return q;
}
int main(int argc, char * * argv)
{
char * a = NULL;
a = getstr1();
char * b = NULL;
b = getstr2();
printf("%#p:%s, %#p:%s", a,a,b,b);
return 0;
}

-----

----
编译器优化代码 一个字符串常量 在常量区存在相同的 则会指向相同的地址相同的值
堆、栈区的理解画图分析为什么这样传参数不对???:
char * getstr()
{
char buf[20];
strcpy(buf,"hello");
return buf;
}
int main()
{
char * p = getstr();
printf("%s" , p);
return 0;
}
指针是基于内存 存储的是内存的地址编号。
对内存的深刻学习,知道内存是在哪分配的。
栈的开口方向int main(){ int a = 10; int b = 3; printf("%#p\n%#p" , &a , &b); return 0;}0X000000000062FE4C
0X000000000062FE48
buf[20] 的内存增长方向int main()
{
char buf[20];
printf("\n%#p \n%#p \n%#p" , &buf[0] , &buf[1] , &buf[2]);
return 0;
}
栈是静态编译 ; 编译器编译期间, 扫描代码期间已经确定下 buf 所代表的内存空间标号 。
函数的执行过程

函数调用
----

----
内存的使用范围:
main() 函数可以在堆栈和全局区上分配内存 fa() fb() 可以使用因为 mian() 函数执行没有结束。
在 fa() fb() 中申请的内存 main() 不一定可以使用。
fa() fb() 在 栈上 分配 则函数结束后消失。
fb() 中全局区的常量字符串可以被 main() fa() 使用
----
一个 main() 函数执行 多次调用函数
c/c++ 编译器只创建一个内存四区
返回地址是在函数调用其它函数时候记录函数执行到哪一行,当其他函数执行之后 ,继续从这一行开始向下执行函数。
指针是数据类型:*p 进行定位内存空间 : 可以进行
读写 
----
常量区不能被修改
char * getstr()
{
char *p = NULL;
p = "admin";
return p;
}
int main()
{
char * p = getstr();
printf("%s" , p);
*(p+2) = 'M'; //挂了
printf("%s" , p);
return 0;
}
指针也是一种数据类型指针做函数参数:
int getA1(char * p1);
int getA2(char **p2);
int getA3(char ***p3);
int getA4(char (*p4)[30]);
int getA5(char p5[10][30]);
在编译器上,都只会分配一个 指针类型变量的空间 4B(sys32 platform)
使用的时候根据业务逻辑来真正当作 一维二维三维指针
指针是一种数据类型,是指它指向的内存空间的数据类型
含义1:指针步长(p++),根据所致内存空间的数据类型来确定
p++=è(unsigned char )p+sizeof(a);
结论:指针的步长,根据所指内存空间类型来定
posted on 2017-07-11 12:21
silvercell 阅读(131)
评论(0) 编辑 收藏 引用 所属分类:
c raise