指针,揭开你的盖头来(四)
来源:互联网 发布:华裔学中文知乎 编辑:程序博客网 时间:2024/06/05 18:15
指针变量与普通变量的区别
C/C++中每一个普通变量都包含两个值:1,变量所在内存的实际值;2,是标识这块内存的地址。我们通过i获得这个变量的实际值,通过&i获取这个变量的地址。
指针变量和普通变量一样,但指针变量包含了三个值:1,变量所在内存的实际值,即另一块内存的地址;2,指针变量的地址,我们可以通过&获得指针变量的地址;3,变量通过引用操作符所获得的指向另一个地址的内存实际值。
这样我们可以看出,指针变量和普通变量的有本质的相似,即他们都是同样的保存在内存中,他们都有一个内存存储值和一个地址值,只是指针变量比普通变量多一个功能,它可以通过*引用操作符获取其内存值所对应的内存地址的存储值(普通变量不可以使用*引用操作符)。
int i = 100 ;
int * j = &i ;
cout << i << endl;
//cout << *i << endl; 编译器会报错,因为这不是一个指针
cout << &i << endl;
cout << j << endl ;
cout << *j << endl ;
cout << &j << endl ;
输出结果:--------------------------------------
100
0x22ff74
0x22ff74
100
0x22ff70
-------------------------------------------------------
指针四要素
一个指针包含四个内容,我们简称为指针四要素,即指针类型,指针所指向的类型,指针的值,指针所指向的值。
1. 指针类型。从指针的声明我们可以看出除去指针变量所剩的部分即指针的类型。比如:int* i ; //指针类型为int*
char *c ; //指针类型为char*
int** j ; //指针类型为int** ,这个是指针的指针
2. 指针所指向的类型。相对来说指针类型对于内存来说没有太大意义,任何指针在内存中都保存为32位的整数。指针类型只是对C/C++编译器有意义,它表明这是一个指针,而不是一个普通类型,编译器需要按指针的方式去解析。
而指针所指向的类型对于内存来说就有很大意义,指针所指向的类型直接决定着编译器如何去读这块内存块,如果这个类型是int,那么编译器需要读32位,如果是long,那么编译器需要读64位。对于一块内存块,如果它被一个普通变量表示,这个普通变量必须有一个数据类型,如果被一个指针指向,这个指针必须有所指向的类型,只有这样,这个内存块才能被正确解析。
最后,我们得给指针所指向的类型一个定义:即指针声明语句中的指针名字和名字左边的指针声明符*去掉所剩下的部分。比如:
int* i ; //指针所指向的类型为int
char *c ; //指针所指向的类型为char
int** j ; //指针所指向的类型为int*
3. 指针的值。指针的值就是指针变量保存在内存中的实际值,这个值是一个内存地址,编译器根据这个内存地址可以找到指针所指向的内存块,从而获取这个指针所指向的值。在32位机器上指针的值就是一个32位的整数。
4. 指针所指向的值。指针的值保存了指针所指向的值的内存地址,编译器根据指针的值获取指针所指向值的首地址,并根据指针所指向的类型解析出指针所指向的值。
- 指针,揭开你的盖头来(四)
- 指针,揭开你的盖头来
- 指针,揭开你的盖头来(一)
- 指针,揭开你的盖头来(二)
- 指针,揭开你的盖头来(三)
- 掀起你的盖头来
- 数据库范式:掀起你的盖头来(1)
- 数据库范式:掀起你的盖头来(2)
- 数据库范式:掀起你的盖头来(3)
- 反射(揭起你的盖头来)
- VC++,掀起你的盖头来(zt)
- VC++,掀起你的盖头来
- VC++,掀起你的盖头来
- VC++,掀起你的盖头来
- VC++,掀起你的盖头来
- VC++,掀起你的盖头来
- VC++,掀起你的盖头来
- 数据库范式:掀起你的盖头来
- 设计模式:策略模式
- tinymce HTML编辑器
- Linux C函数之文件及目录函数
- hibernate 笔记(二)-----one2many
- 我的博客开通啦
- 指针,揭开你的盖头来(四)
- 删除日志文件后重启日志
- FetchMode
- 基于jQuery的ajax功能实现web service的json转化(高级篇)
- 求采购管理系统
- 工作中自己遇到的一些错误和异常....以备不测
- commons.logging1.1.1源代码研究(4)-- JDK14Logger实现
- sizeof 操作符的一个注意事项!
- FREEBSD中使用crunch编译程序