指针和内存
来源:互联网 发布:淘宝达人入口网址 编辑:程序博客网 时间: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和指针的使用
一 指针和内存
程序被编译后要在内存中运行,不同的数据有不同的使用内存的方法,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
- 关于指针和内存
- C#和内存指针
- C#和内存指针
- 指针和内存判断
- C#和内存指针
- C#和内存指针
- 指针和内存
- 指针和动态内存
- 指针和内存(01)
- 指针和内存(02)
- 指针、内存和字节
- 指针和内存
- 指针和内存
- 指针和内存
- 指针和内存
- 指针和内存错误
- 指针和内存管理
- c#内存管理和指针
- android ios
- 生产者/消费者模式
- java synchronized详解
- Android 属性动画监听事件与一个菜单的例子
- Netty系列之Netty高性能之道
- 指针和内存
- C 语言的前世今生
- AngularJS开发者常犯的10个错误
- 2015年手机六大技术趋势预测
- 在eclipse中android NDK开发环境的搭建
- Android中Handler的意义和用法
- Mysql与Oracle区别
- 20150128并查集
- keil编译的CODE.RW.RO.ZI的大小说明