随笔 - 1  文章 - 0  trackbacks - 0
<2026年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿

随笔档案

文章分类

文章档案

搜索

  •  

最新评论



why learn ?
  • the variable 's lifetime
  • the stream to call the func


how c program run

  1. os load the program into the memory
  2. c language div the memory to 4 piece (heap stack global codes)
  3. 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