征服C指针---1.如何理解C指针的值和地址

本文介绍了C指针的概念,通过实例展示了指针与地址的关系。在32位系统中,int指针地址加1增加4字节,double则增加8字节。强制类型转换如(int*)&hoge将double变量hoge的地址赋值给int指针,需要注意类型匹配,否则会导致错误。在debug模式下,变量间可能存在填充字节。
摘要由CSDN通过智能技术生成

   指针长度和地址总线有关。因为指针记录的就是一个地址,那么32位的就是4字节,64位的就是8字节,

也正是地址总线的意义所在.

vs2013 community 编译

#include <stdio.h>
#include <stdlib.h>

void main()
{
    double hoge = 5;
    double piyo = 10;
    int *hoge_p;
    int *hoge_p2;
    printf("&hoge....%p\n", &hoge);
    printf("&hoge地址加1;  %p\n", &hoge + 1);
    printf("&piyo;  %p\n", &piyo);
    printf("&hoge_p....%p\n", &hoge_p);
    printf("&hoge_p2....%p\n", &hoge_p2);
    printf("length....%d\n", sizeof(int));
    hoge_p = (int*)&hoge;
    printf("afeter valued ,hoge_p....%p\n", hoge_p);
    system("pause");
}

结果:

&hoge....008FFB20
&hoge地址加1;  008FFB28
&piyo;  008FFB10
&hoge_p....008FFB04
&hoge_p2....008FFAF8
length....4
afeter valued ,hoge_p....008FFB20
请按任意键继续. . .
 

总结:

1.int *hoge_p,表示声明指向int类型的指针hoge_p

2.int类型地址加1,地址值加4;double类型地址加1,地址值加8。这是因为,对指针进行加1运算,地址的值会增加当前指针所指向数据类型的长度。

3,(int*),强制转化hoge的地址为int型,这样hoge_p的值才能赋值。

指针hoge_p的值

(图片,来自《征服C指针》) 

即,声明指针时,hoge_p会分配一个地址  008FFB04  (win32,所以是32位地址,若改成x64模式,就是64位地址)

    且此地址紧挨着int 变量 hoge和piyo的地址;

对类型的声明,int 和double一个是4字节(利用sizeof(int)查看),一个是8字节,那么其地址空间长度也不一样。(1字节占8个二进制位)

由结果可知,double类型的piyo和hoge地址值相差16个字节(寻址的最小单位是字节,即每一个字节有一个地址),而double只占8个字节。那么中间就相当于隔了两个double长度

int *类型的hoge_p和hoge_p2地址值相差12,一个int是4个字节,就相当于隔了3个int,至于为什么不是1,这个我也不是很清楚

(后面查询了,是如下原因:

debug模式下,每个变量之间都有些填充,double填充了1个,int填充了两个。release下没有。但也没有规定说i1,i2,i3必须是连续的)

hoge_p = (int*)&hoge;通过取hoge的地址,为hoge_p赋值,hoge_p=008FFB20;

即指针变量其

地址为:008FFB04

其值为:008FFB20

 

同时,值得注意的是因为  int *hoge_p,其实声明的是指向int类型的指针变量hoge_p,所以,类型要对应

double  hoge=5;

int *hoge_p;

hoge_p=&hoge;

是会报错的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值