Q-Kevin的编程随笔(二)

 

Q-Kevin的编程随笔(二)

 —– 指针指向的是对象

 

Author: Q-Kevin @ http://www.qkevin.com

 

    前面我们说了,指针就是内存中的一个地址,指向的就是这个地址处的字节,这是最基本的指针的概念。从大的方面来说,一共有两类指针,无类型的指针和有类型 的指针。我们可以把最基本的指针的概念就理解为无类型的指针,因为无类型的指针就仅仅只是指向一个地址而已,没有任何含义,在C/C++中,无类型的指针 用void*来定义,比如:void* pObject = 0x0e84f335 就是一个这样的指针。
     而有类型的指针和无类型的指针有着巨大的区别。有类型的指针指向的是一个内存块,而内存块的大小(size),也就是内存块的字节数,取决于这个指针的类 型,一般来说这个内存块的大小就是sizeof(类型),内存块的大小可以是一个字节(指针类型是char*),可以是两个字节(指针类型是 short*),可以是四个字节(指针类型是int*),理论上,指针所指向的内存块的大小可以是任意大小(从0到最大内存容量)。
    当然,有类型的指针和无类型的指针一样,仍然是指向内存中的某一个字节,而指针所指向的那个字节是这个内存块的第一个字节,也就是这个内存块的起始地址, 而这个内存块所存储的就是一个对象(object)的内容(或者是多个相同类型对象的内容,即数组),这里所说的对象是广义的对象,可以是C/C++语言 内建的数据类型,也可以是用户自定义的数据类型,即struct, class等,还可以是一段可执行代码。下面以32位系统为例举例说明:

    char ascii = ‘A’; 这条语句定义了一个char类型的变量,并且编译器会在内存中分配一个字节的内存块中来保存数值‘A’;
    char* pAscii = &ascii; 这条语句定义了一个指针变量,指针类型是char*,并且使这个指针变量个对象ascii(我们把sceii看做是一个字符对象)所占据的一个字节的内存 块的起始地址,这个内存块所存储的内容就是字符‘A’, pAscii变量本身也要占用连续四个字节的内存块。如图所示:


 

     int age = 21;这条语句定义了一个int类型的变量,并且编译器会在内存中分配连续的四个字节的内存块中来保存数值21;
     int* pAge = &age; 这条语句定义了一个指针变量,指针类型是int*,并且使这个指针变量指向对象age(我们把age看做是一个整数对象)所占据的连续四个字节的内存块的 起始地址,这个内存块所存储的内容就是整数21,pAge变量本身也要占用连续四个字节的内存块。如图所示:

 

    class MyCar { /*数据和函数定义,省略*/ };这条语句定义了一个新的类MyCar,类内部的数据和函数定义在这里省略;
     MyCar mycar;这条语句定义了一个MyCar类型的变量,并且编译器会在内存中分配连续的sizeof(MyCar)个字节的内存块来存储变量mycar的值;
    MyCar* pMycar = &mycar;这条语句定义了一个指针变量pMycar,指针类型是MyCar*,它所指向的内存块的大小是sizeof(MyCar),它指向 这个内存块的第一个字节,这个内存块存储的就是变量mycar的值,pMycar变量本身也要占用连续四个字节的内存块。如图所示:

 

 

    MyCar allcars[3];这条语句定义了一个数组变量allcars,编译器会在内存中分配连续的内存块大小为3 * sizeof(MyCar) 来存储这个数组变量的值(注:由于字节对齐的原因,实际的连续内存块大小可能会稍大于 3* sizeof(MyCar),这需要视具体的操作系统和编译器而定)。
    MyCar* pAllcars = allcars;这条语句定义了一个指针变量pAllcars,指针类型是MyCar*,它所指向的内存块大小为 3* sizeof(MyCar),这个指针变量指向这个内存块的第一个字节的地址,及起始地址,pAllcars变量本身也要占用连续四个字节的内存块。如图 所示:

 

=====================================================================================
声明:
《Q-Kevin的编程随笔》系列文章可随意转载,但必须保留本段声明和每一篇文章的原始地址。
作者保留版权,未经作者书面同意,不得用于任何商业用途

《Q-Kevin的编程随笔》系列文章总索引:http://www.qkevin.com/essay
本文原始地址:http://www.qkevin.com/archives/249

前一篇: C/C++中指针的基本概念, http://www.qkevin.com/archives/238
后一篇: 指向指针的指针, http://www.qkevin.com/archives/261
=====================================================================================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值