阿里笔试 数组指针与指针数组

来源:互联网 发布:凯文约翰逊生涯数据 编辑:程序博客网 时间:2024/06/02 12:59

阿里2014实习生笔试有这么一个选择题:问64位操作系统   int *a[2][3]占多少个字节 ?这道题首先要搞清数组指针和指针数组这两个概念



指针数组

            通俗点说指针数组就是一个数组里面存的都是指针 例如题目当中的int *a[2][3]就是一个指针数组,一个二维数组里面存放了指向int型的指针,“[]”的优先级比“*”要高。a先与“[]”结合,构成一个数组的定义,数组名为a,int *修饰的是数组的内容,即数组的每个元素。画图如下


                          

数组指针

          形式如int(*a)[2][3]这种为数组指针,首先他是一个指针,指向一个数组,是一个指向数组的指针,在这里“()”的优先级比“[]”高,“*”号和a构成一个指针的定义,指针变量名为a,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。画图如下
       

                              



64位系统跟32位系统中指针所占字节的区别

        搞明白了数组指针跟指针数组之后困扰我们的问题就成了在64位系统中一个指针所占的字节数。
        在《深入理解计算机系统》这本书中介绍过指针一般为系统的字长,故64为系统中指针占8个字节,注意在64位系统当中int型变量依旧是占4字节,口说无凭,我们在VS中编译如下代码测试,注意编译时选择X64平台,不能用WIN32,因为WIN32编译出来的依旧是模拟的32位的平台
#include "stdio.h"#include "stdlib.h"int main(){int *a;printf("%d",sizeof(a));system("pause");}
程序运行如图所示


a跟&a的区别

很多人搞不懂在用数组时a与&a的区别,请看如下代码
#include "stdio.h"#include "stdlib.h"int main(){int a[3]={1,2,3};int *p=(int*)&a;int *p1=a;int *p2=&a[0];printf("%d\n",p);printf("%d\n",p1);printf("%d\n",p2);    p=(int*)(&a+1);p1=a+1;p2=(&a[0]+1);printf("%d\n",p);printf("%d\n",p1);printf("%d\n",p2);system("pause");}
程序输出如下图

他们的地址虽然一样但是加一之后的地址却有了区别,区别在于&a表示的是数组的首地址,所以加1之后增加的为sizeof(a),而a表示的是数组首元素的首地址,所以加1后只增加了4个字节
练习题如下
#include"stdio.h""#include"stdlib.h"int main(void){int a[5]={1,2,3,4,5};int *ptr=(int *)(&a+1); //ptr移动sizeof(a),固指向数组之后的地址空间printf("%d %d\n",*(a+1),*(ptr-1));system("pause");return 0;     }
输出为2,5
0 0