a和&a的区别、二维数组的本质及多维数组

1 a和&a的区别

int a[10] = {1,2};//其他初始化为0  
a代表数组首元素的地址,不是整个数组的地址
&a表示整个数组的地址 &a,a代表的数据类型不一样
&a数组类型int[10]
a 数组首元素的类型

 2 数组指针的用法

int i=0;//循环变量
int a [5] = {3, 4, 5, 6, 2};
//直接定义一个数组指针
int (*p)[5] = &a;
for (i=0; i<5; i++)
{
    printf("%d\n", (*p)[i]);
}

3 二维数组的本质

结论:二维数组名charmyArray[3][5]是一个数组指针,char (*)[5]

#include "stdio.h"
#include "stdlib.h"
int main()
{
    int i,j;//循环变量
    int k=0;
    char myArray[3][5];//myArray是一个数组指针
    for (i=0;i<3; i++)
    {
        for (j=0; j<5; j++)
        {
            myArray[i][j]=k++;
        }
    }
    for (i=0;i<5; i++)
    {
        printf("%d ", (*myArray)[i]);//输出 0,1,2,3,4
    }
    system("pause");
    return 0;
}

4 二维数组的三种内存模型

int     printf2Array_1(char myArray[3][10], intiNum)
{
         int i = 0;
         for (i=0; i<iNum; i++)
         {
                   printf("%s \n",myArray[i]);
         }
         return 0;
}
 
intprintf2Array_2(char myArray[][10], int iNum)
{
         int i = 0;
         for (i=0; i<iNum; i++)
         {
                   printf("%s \n",myArray[i]);
         }
         return 0;
}
intprintf2Array_3(char (*myArray)[10],int iNum)
{
         int i = 0;
         for (i=0; i<iNum; i++)
         {
                   printf("%s \n",myArray[i]);
         }
         return 0;
}

5 多维数组

1 )不管是几维数组,都是线性存储的。所以会存在多维数组做函数参数,退化问题。

2 )多维数组做函数参数二维数组,能勉强表达出来。但是三维数组,四维数组,,就表达不出来了。

结论:指针做函数参数,有效内存维数,只到2级。如果你看到3级指针 4级指针,它表示的不是内存的维数。

       数组参数                                   等效的指针参数
一维数组 chara[30]                          指针 char*
指针数组 char*a[30]                        指针的指针 char **a
二维数组 chara[10][30]                    数组的指针 char(*a)[30]


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。