赞
踩
今天在刷题的时候遇到了一道这么一道题:
设有如下程序:
- #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字节。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。