C语言提高-32讲: 二维数组

原创 2017年10月27日 20:16:44

知识点总结:

      

        一:二维数组及其定义

              初始化
             1)分行给二维数组赋初值
             2)将所有数据写在一个花括号内
             3)只对部分元素赋初值,其他元素值自动置零

             二维数组定义中缺省行数(列数不可省),例:
             int a[][4]={1,2,3,4,5,6,7,8};    //要求对全部元素赋初值
             int a[][4]={{0,0,3},{},{0,10}};  //要求分行赋初值


         二: 二维数组元素的引用

               输入输出二维数组元素(输入时将每行每列保存到内存空间)
               输出时按不同格式输出
              1)行序优先      //与输入相同
              2)列序优先      //将原来的列作为行输出【1)的转秩】

                   

                    矩阵的转秩(或用输出格式控制)

                   

              3)倒序输出
                   


         三:二维数组的存储

               二维数组的存储:按行连续存放(行序优先);二维数组可视为(元素是一个一堆数组的)一维数组

               行地址 a+i&a[i],区别于a[i]
               列地址 a[i]+j &a[i][j]
               一层一层剥开我的心
             

             

            

         四:使用指针操作二维数组

                 数组指针:*p / (*p)[j]指向一维数组的指针变量

                 区分p是指向元素的指针(列地址)or指向一维数组的指针(行地址),即指针的类型要匹配

                 指针数组*a[i]定义的是数组,数组元素是指针a[i]是指向第i行数组的指针(列地址)

                

                                

//指针数组(数组元素是指针)
#include <stdio.h>
int main(){
    int b[2][3]={{1,2,3},{2,4,6}};
    int *pb[2];
    int i,j;
    /*   pb是一个二级指针,pb[0]则是一级指针
         b[0]是列指针,是存放着1,2,3的一维数组   */
    pb[0]=b[0];      
    pb[1]=b[1];                                       
    for(i=0;i<2;i++){
        for(j=0;j<3;j++){
            printf("%2d",*pb[i]);
            pb[i]++;
        }
        printf("\n");
    }
    return 0;
}             

                 若将程序做以下改动:

    #include <stdio.h>
    int main(){
        int b[2][3]={{1,2,3},{2,4,6}};
        //int *pb[2];
        int i,j;
        //pb[0]=b[0];      
        //pb[1]=b[1];
        for(i=0;i<2;i++){
            for(j=0;j<3;j++){
                printf("%2d",*b[i]);
                b[i]++;
            }
            printf("\n");
        }
        return 0;
    }
              

                分析:主函数中的变量b是定义的数组,虽然代表了数组首地址和第一个元素的地址,

                           但是是不能改变的,不能对其做赋值运算。这个时候就可以定义一个指针数组


         五:多维数组作函数参数

                 例  3个学生4门课,计算总平均分,并输出第n个学生成绩  

                 注意函数的声明、定义和调用

                 声明p是指向元素的指针调用列地址;声明p是指向一维数组的指针调用行地址        

//多维数组名作函数参数(数组指针的应用)
#include <stdio.h>
void average(int *p,int n);        //P是指向一维数组的指针(全部元素形成的一维数组)
void search(int (*p)[4],int n);    //P是指向一维数组的指针(每行元素形成的一维数组)
int main(){
    int score[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};
    average(*score,12);            //列地址,指向每一个元素
    search(score,2);               //行地址,指向每一行数组
    return 0;
}
void average(int *p,int n){        //p是指向一个一维数组(一行12个元素)的指针
    int sum=0,aver,*p_end; 
    p_end=p+n-1;                   //提前定义最后一个元素的地址值
    for(;p<=p_end;p++)             //用一个一级指针去遍历一个二维数组,需要把一个二维数组看成一维的
        sum+=*p;
    aver=sum/n;
    printf("average=%4d\n",aver);
}
void search(int (*p)[4],int n){
    int i;
    printf("No.%d: ",n);
    for(i=0;i<4;i++)
        printf("%4d",*(*(p+n)+i)); //二维数组的逻辑结构并不是一维的,以一维的形式保存在内存
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

如何在C/C++中动态分配地址连续访问快速的二维数组

如何在C/C++中动态分配二维数组 在C/C++中动态分配二维数组可以先申请一维的指针数组,然后该数组中的每个指针再申请数组,这样就相当于二维数组了,但是这种方法会导致每行可能不相邻,从而访问效...
  • lovehota
  • lovehota
  • 2013年11月21日 09:17
  • 2347

C语言教学--二维数组和指针的理解

对于初学者对二维数组和指针的理解很模糊, 或者感觉很难理解, 其实我们和生活联系起来, 这一切都会变得清晰透彻.   我们用理解一维数组的思想来理解二维数组, 对于一维数组,每个箱子里存放的是具体的...
  • lovesummerforever
  • lovesummerforever
  • 2013年11月14日 13:58
  • 8060

关于c语言二维数组与指针的个人理解及处理办法。

此文章简要介绍了二维数组和指针以及函数的处理方法。
  • love1code
  • love1code
  • 2015年02月12日 21:58
  • 1656

任意行列二维数组C语言实现

在C语言中,数组是一个连续的线性存储结构,数组名称即为数组首元素首地址,中括号被C语言解释为指向运算,通过对指针的加法,实现取得相应元素。对二维数组的使用则相当于定义一个二阶指针,可以看做是一个一维数...
  • Judy_c
  • Judy_c
  • 2017年03月14日 10:55
  • 1002

——黑马程序员——C语言中二维数组、字符数组和字符串

-----------android培训、java培训、java学习型技术博客、期待与您交流!-----------
  • yhp1095785221
  • yhp1095785221
  • 2015年11月01日 11:19
  • 2259

C语言二维数组的本质

#define _CRT_SECURE_NO_WARNINGS #include #include #include void main(){ int a[3][5], i=0,j=0;...
  • LHN_hpu
  • LHN_hpu
  • 2016年06月24日 16:24
  • 571

c语言二维数组的定义和初始化

二维数组: 用于存放一位数组的数组,被称为二维数组。 #include //二维数组的长度 #define kI 3 #define kJ 4 /** 打印二维数组元素 */...
  • CHANGXIAOTING
  • CHANGXIAOTING
  • 2015年09月03日 00:44
  • 6259

【C语言疯狂讲义】(十二)C语言二维数组

二维i数组     1、概念:     一维数组      相同数据类型的(有序)的数据集合。     二维数组      一维数组的每一个元素又是一个一维数组(嵌套)二维数组   ...
  • liwei3gjob
  • liwei3gjob
  • 2014年11月18日 21:08
  • 1667

C语言_二维数组

ddddd
  • Damoncw
  • Damoncw
  • 2014年10月21日 08:26
  • 5304

C语言:定义指向二维数组的指针变量

C语言:定义指向二维数组的指针变量标签: C语言 二维数组 指针 by 小威威1.引入我们知道,要在函数中处理数组,一般要给函数传递指针。那么,对于一维int数组a[10],我们可以定义一个in...
  • linwh8
  • linwh8
  • 2015年12月17日 21:14
  • 9982
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言提高-32讲: 二维数组
举报原因:
原因补充:

(最多只允许输入30个字)