指针和内存

来源:互联网 发布:淘宝达人入口网址 编辑:程序博客网 时间:2024/06/04 19:46
    开始写博客了,技术书籍读了一些,可看完就忘,每次遇到问题都是 感觉在哪见过之后从新找,受够了这种低效而又愚蠢的学习方法,看到有很多大牛都在博客上记录技术鄙人向之学习,本着开源精神共享技术。

一 指针和内存

  程序被编译后要在内存中运行,不同的数据有不同的使用内存的方法,C语言程序有三种:

 1)静态/全局内存

        这种数据事先在程序中声明为全局变量 局部静态变量或全局静态变量,在程序开始运行时分配内存,程序运行结束后,该数据消失;

 2)自动内存

        这种数据一般声明在函数中,在函数调用是分配内存,调用结束后消失,整个作用域在函数中;

 3)动态内存

    在程序运行中,根据需要会动态的分配内存,通过malloc()或其它类似函数来不断申请 消除 改变使用内存的大小,内存分配在堆上,直到释放才消失,指针引用的内存的作用域局限于引用内存的指针,该指针引用完这块内存也失去了作用,应手动释放。

      指针在使用时的问题:1 访问数组或其它数据结构是越界;2自动变量消失后被引用;3 堆上分配的内存释放后被引用;4 内存分配前解引指针

二 指针的引用

1 指向函数的指针

    void (*foo)();

2     NULL为((void *)0)

3 需用sizeof来取指针的字节数,比如sizeof(char *),指针的字节数与内存结构有关和编译器有关,相同环境下的说有指针长度相同(函数指针有待探究);不同内存模型的数据长度也不同,内存模型(32位/64位)取决与操作系统和编译器,一中系统可支持多种模型,这通常是编译器选项来控制的;

4 指针和整数可进行加减;指针之间可以相减及比较大小;函数指针不一定具备这三种能力;

5 多层间接引用

  char *title[] = {"asdf","jkld","sas"};

  char **getstring[2];

  getstring[0] = &title[0];

  getstring[1] = &title[1];

6 常量与指针

1)指向常量的变量指针

       int num;//const int num也可以

       const int *pi;//不能通过*pi = num;来给num赋值,除此无其他限制;
    a.pi可被修改为指向不同的整形变量或常量;
    b.可以通过*pi读取值;
    c.不能通过*pi改变整形的值(仅此一条限制)

2)指向非常量的常量指针
    int num;
    int *const pi = #//pi必须初始化时赋值,后不能再修改pi;*pi可被修改
3)指向常量的常量指针
    const int *const pi = #//指针不能修改,指向的数据不能修改
4)指向 指向常量的常量指针的指针
    const int *const *pi;


三 小结
1 在不同场合小如何声明和使用指针;
2 NULL的概念和变种((void *)0);
3 指针的长度是可变的,他取决目标系统和编译器支持的内存模型;
4 const和指针的使用    


0 0
原创粉丝点击