一维数组的探索

来源:互联网 发布:银背大猩猩战斗力知乎 编辑:程序博客网 时间:2024/05/22 04:50

       昨天面试时被考官问到指针和数组,比较刁钻的问题,没答出来,丢死人了

       按照定义,一维数组是指全部数组元素组成的一段连续的存储空间,这个空间称为数组变量。数组中的元素只能间接引用,所谓间接引用,是指通过指向该单元的地址指针来访问该单元。因此,数组名都代表数组首元素的指针常量(首元素的地址)。其实数组名首先是数组空间的标识符,代表数组变量,这就是数组名的另一个含义

       数组变量的类型是由数组元素类型和数组长度联合表示,如:

                                                                                                                double d[5];

       数组变量d的类型是double[5].表达式sizeof(d) == 40;

       数组空间取值&d的基类型是double[5],&d+1比&d大40.

       数组指针d的基类型是double*,是指向数组首元素的指针常量。



       如果想要高效的利用内存资源,可以通强制类型转换把数组空间的指针传递给其它类型的指针变量,这样就可以把用过的数组空间用来存放其它类型的数据,实现内存空间的最大利用。原理:同一段空间,可以用做不同类型的数组空间,取决于访问空间的指针类型


      用指针最怕啥?野指针!何为野指针,一个指针变量若果没赋值,它存储的地址就是不确定的,若果利用这样的指针执行间接引用,会破坏系统中的数据,是非法的!

      如:int *p; 

              *p = 5;//非法!

    void型指针称为通用指针或泛指针,可以把任何类型变量的地址赋给它,但不能利用泛指针做相应类型的访问处理!

   如:   void *p;     int x=5;

             p=&x;   //合法

            *p=6;    // 非法

            printf("%d",*p); //非法

    void 指针主要用于单纯的内存数据复制,内存分配函数malloc()返回的就是void型指针,如(int*)malloc(1024);就表示malloc返回的是基类型为int的指针。(坑爹啊,考官问的就是这题,可我当时脑子里一片空白!!!)


    在ANSI  C标准中,不允许对void指针进行一些算术运算如p++或p+=1等,因为既然void是无类型,那么每次算术运算我们就不知道该操作几个字节,例如char型操作sizeof(char)字节,而int则要操作sizeof(int)字节。而在GNU中则允许,因为在缺省情况下,GNU 认为void *和char *一样,既然是确定的,当然可以进行一些算术操作,在这里sizeof(*p)==sizeof(char)。

0 0