指向变量所占字节问题

        今天在刷题的时候遇到了一道这么一道题:

设有如下程序:

#include<stdio.h>
    main()
    {
       int **k, *j,i=100;
       j=&i;k=&j;
       printf("%d\n",**k);
    }

A、运行错误        B、100        C、i的地址        D、j的地址

答案     (左键勾选查看答案)
j=&i,j的值就是i的地址,*j=100,

再将j的地址赋给k,这时*k=j,

那么,**k=*j,而*j=100,所以**k=100,最后的打印结果应当为100。

看到D选项的时候我意识到一个问题,如果我把他们地址全打印出来会是什么样?

代码实现:

#include <stdio.h>

    main()
    {
       int **k, *j;
       int i=100;
       j=&i;k=&j;

       printf("%d\n",**k);
       printf("%d\n",&k);
       printf("%d\n",&j);
       printf("%d\n",&i);

    }


结果:

100
6422040
6422032
6422028

Process returned 0 (0x0)   execution time : 0.014 s
Press any key to continue.

        令我疑惑的是,k的地址是从6422040开始,而不是6422036。int型占4个字节。自然K应该也是4个字节。是地址分配问题?还是说指针所占字节和指向的类型变量无关?

为了寻求真相,我使用了sizeof(),括号中写入变量名,返回值为该变量所占字节数。

代码实现:

#include <stdio.h>

    main()
    {
       int **k, *j;
       int i=100;
       j=&i;k=&j;

       
       printf("%d\n",sizeof(k));
       printf("%d\n",sizeof(j));
       printf("%d\n",sizeof(i));
    }

结果:

100
8
8
4

Process returned 0 (0x0)   execution time : 0.019 s
Press any key to continue.

k指向的是指针,j指向的是整型。可以得出,指针所占字节数为8个字节。和所指向变量的数据类型无关。在查阅资料中还发现,因为我的测试环境是64位,占8个字节。而32和16环境下,指针分别为4字节和2字节。
 

总结         

在64位下,指针指向任何类型的变量都是占用8个字节。32和16环境下,指针分别为4字节和2字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值