数组小结

来源:互联网 发布:youtube无网络连接ios 编辑:程序博客网 时间:2024/04/27 22:48

           数组是一组相同元素的集合。

        数组在创建时,[ ]中一定要给常量,不能给变量。

        在绝大多数表达式中,数组名的值是指向数组第一个元素的指针。这个规则只有两个例外:1、sizeof(arr),即sizeof返回整个数组所占用的字节而不是一个指针所占用的字节;2、&arr,单目操作符&返回一个指向数组的指针。

         除了优先级不同以外,下标表达式array[value]和间接访问表达式*(array+(value))是一样的。

        当数组名作为函数参数传递时,时间传递给函数的是一个指向数组第一个元素的指针,函数所接受到的参数,实际上是原参数的一份拷贝,所以函数可以对其进行操作而不会影响实际的参数。但是,对指针参数执行间接访问操作允许函数修改原先的数组元素。

         一维数组的运算实例:

             int a[]={1,2,3,4}

 printf("%d\n",sizeof(a));//4*4=16,a指的是整个数组,一个int元素占4个字节,所以一共16个字节 printf("%d\n",sizeof(a+0));//4,a指的是数组第一个元素的指针,指针占4个字节 printf("%d\n",sizeof(*a)); //4,*a是指针变量 printf("%d\n",sizeof(a+1));//4,a+1指的是第二个元素的指针
 printf("%d\n",sizeof(a[1]));//4,a[1]指第一个元素的下标 printf("%d\n",sizeof(&a));  //4,这里的a虽然是整个数组,但是&a表示a地址,地址只占4个字节 printf("%d\n",sizeof(*&a)); //16 ,对整个数组的地址解引用就得到了数组中全部的四个元素(*解引用操作符) printf("%d\n",sizeof(&a+1));//4,(&a+1)跳过去一个数组,也就是这个数组后面的地址,地址总归是地址,所以是4 printf("%d\n",sizeof(&a[0]));//4,&a[0]指数组第一个元素的地址 printf("%d\n",sizeof(&a[0]+1));//4,(&a[0]+1)指数组第二个元素的地址

        多维数组实际上是一维数组的一种特型,更明了的来说,多维数组就是把一维数组的每个元素都看作数组,再把下一级数组的元素再看做一个数组......依次递推;也就是数组套数组。多维数组中的元素根据主序进行存储,也就是最右边的下标率先变化。多维数组名的值是一个指向他第一个元素的指针,也就是一个指向数组的指针。



            二维数组的运算实例

       以上面的图为例进行讲解,他本是一个三行四列二维数组,但是我们把它看做一维数组,那么他就是一个有三个元素的一维数组,不过和一维数组不同的是,他的元素也是数组。

      

int a[3][4] = {0};printf("%p\n", &a[0][0]);printf("%p\n", a+1);printf("%d\n",sizeof(a));//48,a代表整个数组,这个数组中一共有3*4=12个元素printf("%d\n",sizeof(a[0][0]));//4,a[0][0]指第一行第一个元素printf("%d\n",sizeof(a[0]));//16,a[0]第一行所有的元素printf("%d\n",sizeof(a[0]+1));//4,(a[0]+1)指第二行所有的元素printf("%d\n",sizeof(a+1));//4,(a+1)指这个就应该把二维当一维看待,那么a就表示第一个元素的地址,
                                       // 然后我们再对比二维数组就知道了在二维数组中,他代表的是第一行的地址printf("%d\n",sizeof(&a[0]+1));//4,(&a[0]+1)第二行的地址printf("%d\n",sizeof(*a));//16,在一维数组中,*a表示对第一个元素的地址解引用,在二维数组中,
                                  //他就表示对第一行解引用printf("%d\n",sizeof(a[3]));//16,a[3]指第三行所有的元素

原创粉丝点击