为什么指会要定义类型?这个问题是一个值得思考的问题。
我们在写c/c++程式的时候都知道,定义每个变量都要告诉编译器类型,这种就是强类型语言。比如
int i; long a;doubl c;? int* p;float* c;
哪下面来想一下,如果定义指针时不指定类型会怎样。
void* q; void*p;
对,这样完全可以编译没有一点问题,因为指针在内存中都是固定大小,4字节,不管是int*,float*,double*,还包括自定义类型指针。
下面是测试代码:主要用到sizeof关键字获取
测试结果:
p指针大小:4
a指针大小:4
c指针大小:4
v指针大小:4
n指针大小:4
以上大家会认为可以定义不指定类型的指针了。前提是这个指针只做记录地址,不做任何计算。
为什么这样讲,因为只做地址记录是没有问题的,都是4字节,在内存中的数据都一样。如果一但做了运算就会错乱。
这里再讲下,指针的运算。
指针是可以做四则运行? 加? 减? ?乘? 除。? 将指针当成变量就很好理解这样事情。例如:
1 2 3 4 5 6 7 8 9 10 11 |
int a[2]={0,1}; a[0]=a[0]+1;? a[0]=a[0]-1; int* p = &a;? ? (如果p类型改成 void*,下面的加减运算将不能编译) p = p+1; p = p-1; |
只是指针的加,减意义是,地址值加减一个类型距离。 指针乘? 除也可以做,只是没有意义,因为乘? 除完后这个地址到底指的是什么就不知道。(如果你的程式设计指针乘? 除后地址是有意义的,哪么也是可以用的,但一般很少有这样用的)
一个类型距离:这个就是为什么定义指针一般都声名类型的原因。
注:当你可以得到喜欢女孩家的地址时,你怎是不会 就停在得到地址阶段,这也就是为什么一般声明时会不用void*。有时退一步换个角度去理解也许问题并没有哪么难。