指针,揭开你的盖头来(四)

来源:互联网 发布:华裔学中文知乎 编辑:程序博客网 时间: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.   指针所指向的值。指针的值保存了指针所指向的值的内存地址,编译器根据指针的值获取指针所指向值的首地址,并根据指针所指向的类型解析出指针所指向的值。

原创粉丝点击