指针和数组的一个例子

例子: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












评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值