例子:1-1
#include <stdio.h>
int main(){
int a[5] = {1,2,3,4,5};//flag_0
// int *ptr = (int *)(&a+1);
// printf("p=%p,a=%p\n",ptr,a);
int *ptr = (int *)(&a+3);
/*flag_a:很多人觉得因为加上(int *)了,所以+3才有影响,我想少年,你错了.你要了解一下数组指针因为&a就是数组指针,那么这个数组指针的类型 是:int (*)[5];您可能会问,int(*)[5]是怎么来或者是怎么理解的,这个呢,如果您对指针有足够多的了解,就在flag_0定义时,就可以确定它了。这个我也没有怎么多说的,只能指出一个方向,理解还是要靠自己,如果您不理解,说明您跟指针和数组的沟通还有点少,多多亲热一下。*/
printf("p2=%p\n",ptr) ; // %p 是会以16进制格式输出地址.printf("%2d%%,%2d%%\n",*(a+1),*(ptr-12)); //flag_b: %%是我故意玩的,是为了要输出一个%.
printf("%d\n",sizeof(a)); // flag_c: 从这里更可以看出a的数是怎么,因为结果是20,当然您可能觉得受(int *)强制时有影响了,请看一下1-2例子.
printf("%d\n",sizeof(ptr)); //计算一下指针地址占多少位,好计算flag_b,因输出哪个就输出哪个.
return 0;
}
注意:当您看完代码时,您要明确一点:(1)ptr = a数组起始地址(用a_start_addr表示)+60个偏移位.(2):(ptr-12)=a_start_addr+60-12*4=a_start_addr+12;
说明从start移动了12/4=3个类型位,因位首地址指向了第一个数,从首地址在偏移3个类型位,那是就是4..
//运行结果:
p2=0xbf853964
2%, 4%
20
4
我想就这个函数,一般面试呀,网上的分析的不少。当然要积累就得有量呀,我也不免得去分析,
因我最近要想把多维数组和多级指针掌握精通,由于以前比较少用,所以对它们好不畏惧,心里
怕是吧,那就挑怕的来打一顿。本来想在下面说明一下以上的例子的,但觉得不习惯,看下面的文字,
又得去看一下代码,那就去代码上加注释吧。
1-2例:
#include <stdio.h>
int main()
{
int a[5] = {1,2,3,4,5};
printf("%d\n",sizeof(a));
// int *ptr = (int *)(&a+1);
// printf("p=%p,a=%p\n",ptr,a);
int *ptr = (int *)(&a+3);
printf("p2=%p\n",ptr);
printf("%2d%%,%2d%%\n",*(a+1),*(ptr-12));
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(ptr));
return 0;
}
运行结果:
20 //放前是20
p2=0xbffd7304
2%, 4%
20 //被强制(真的被强制)后还是20
4
2823

被折叠的 条评论
为什么被折叠?



