今天在刷题的时候遇到了一道这么一道题:
设有如下程序:
#include<stdio.h>
main()
{
int **k, *j,i=100;
j=&i;k=&j;
printf("%d\n",**k);
}
A、运行错误 B、100 C、i的地址 D、j的地址
答案 B (左键勾选查看答案)
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字节。