读csapp有感:指针的思考

指针:指针就是一个地址,说到底就是用来寻址的,大部分计算机的字长是32位,虚拟地址的范围为0-2的31次方,指针只需要32位就可以完全寻址了,当机器的字长为64位时,32位显然就不够用了,机器的虚拟地址范围为0-2的63次方,也就是说指针需要64位才能完全寻址。这就是为什么64位的机器的指针为8字节的缘故。

另外贴一段代码

#include <stdio.h>
int main()
{
	int a[10] = {
		1, 2, 3, 4, 5, 6, 7, 8, 9, 0
	};
	int *pa, *pb;
	pa = a;
	pb = a + 1;
//	printf("%d\n", pa);
//	printf("%d\n", pb);
	printf("%d\n", pb - pa);
	printf("%d\n", (int)pb - (int)pa);
	return 0;
} 

输出的结果是1和4,指针之间的运算必须满足两个指针同时指向一个数组,运算时比较两个 指针之间元素的个数, 而不是先转化为整形再进行运算。

再分析下边的一个例子


#include <stdio.h>
int main()
{
	int a[10] = {
		1, 2, 3, 4, 5, 6, 7, 8, 9, 0
	};
	int *pa, *pb;
	pa = a;
	pb = a + 1;

	printf("%d\n", &a + 1 );
	printf("%d\n", a);
	printf("%d\n", (int)(&a + 1) - (int)a);
	return 0;
} 
输出结果是


2293560

2293520

40

如何解释这个问题,我们可以看到 &a +1,&a是指向a[10]的指针,相当于一个二维数组。(int)(&a + 1),就是加上4 * 10个字节,这样这个问题就得到了比较好的解释了,指针加1,指针就在地址上就加上一个等于该指针指向元素的所占空间的值。


你可能感兴趣的:(读csapp有感:指针的思考)