C语言——二维数组

二维数组

一、二维数组的定义

类型名  数组名[ 常量表达式1 ][ 常量表达式2 ]
int a[2][2]

二维数组可以看成是矩阵(或表格),常量表达式1可以看成矩阵(表格)的行数,常量表达式2可以看成矩阵(表格)的列数。

二维数组可以看成一个一维数组a[0],a[1],数组中的元素又是一个个一维数组a[0][0],a[0][1]和a[1][0],a[1][1]

在内存中,二维数组站一系列连续的存储单元。存放的顺序是“ 按行存放

二、二维数组的初始化

1、赋初值个数与数组元素个数相同

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

2、一行所赋初值个数与数组每行元素不同

系统自动给该行后面的元素补充初值0,但是不能跳过每行前面的元素给后面的元素赋初值

int a[4][3] = {{1,2,3},{1},{1,3},{1}}
// 等价于
int a[4][3] = {{1,2,3},{1,0,0},{1,3,0},{1,0,0}}

3、赋初值行数少于数组的行数

系统自动给不足行赋初值0

int a[4][3] = {{1,2,3},{1}}
// 等价于
int a[4][3] = {{1,2,3},{1,0,0},{0,0,0},{0,0,0}}

4、赋初值时省略花括号

系统按照元素在内存中排列的顺序,将{}中的元素一一对应地赋给各个元素,若数据不足,后面的元素自动赋初值0

int a[4][3] = {1,2,3,4,5,6,7}
// 等价于
int a[4][3] = {{1,2,3},{4,5,6},{7,0,0},{0,0,0}}

三、通过赋初值定义二维数组的大小

在一维数组中可以省略常量表达式,通过赋初值个数来确定数组的大小。

==> 二维数组也可以省略常量表达式,但是 只能省略常量表达式1

int a[][3] = {{1,2,3},{1},{2,3}}
// 等价于
int a[3][3] = {{1,2,3},{1},{2,3}}
int a[][3] = {1,2,3,4,5,6,7}
// 等价于
int a[3][3] = {{1,2,3},{4,5,6},{7,0,0}}

四、二维数组与指针

1、二维数组的名字

? 在二维数组中,数组名也是一个存放地址的指针,它的值是二维数组中第一个元素的地址。a与a[0]的值相 同,a+1与a[1]的值相同,a+2与a[2]的值相同,他们分别表示第一行、第二行、第三行的首地址。

? ===> 二维数组的名字是一个行指针,表示一行的首地址

2、二维数组元素的地址

// 三种方式等价
&a[i][j]
a[i]+j
*(a+i)+j

3、引用二维数组元素

  • 通过地址引用二维数组元素
int a[3][4]

a[i][j]  <==>  *(a[i]+j)  <==>  *(*(a+i)+j)
  • 通过建立指针数组引用二维数组元素
int *p[3],a[3][2]

*(p[i]+j)  <==>  *(*(p+i)+j)  <==>  (*(p+i))[j]  <==> p[i][j]
  • 通过建立一个行指针引用二维数组元素
int a[3][2],(*p)[2]

p[i][j]  <==>  *(p[i]+j)  <==>  *(*(p+i)+j)  <==>  (*(p+i))[j]

4、二维数组名与指针数组作为实参

  • 二维数组名作为实参

    当二维数组名作为实参时,形参必须是一个行指针变量

main(){
    int s[M][N];
    fun(s);
}

// 形参的三种书写形式
fun(int (*a)[N])
fun(int a[][N])
fun(int a[M][N])
  • 指针数组作为实参

    当指针数组名作为实参时,形参必须是一个指向指针的指针

main(){
    int s[M][N], *ps[M];
    for(int i=0;i<M;i++)ps[i]=s[i];
    func(ps)
}

// 形参的三种书写形式
func(int *a[M])
func(int *a[])
func(int **a)

原文地址:https://www.cnblogs.com/linagcheng/p/9879110.html

时间: 2024-10-25 15:06:00

C语言——二维数组的相关文章

C语言二维数组作为函数的参数

前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: #include <cstdio> void print(int *a[3]) { printf("%d\n",a[0][0]); } int main() { int a[2][3] = {1,2,3,4,5,6}; print(a); return 0; } 编译程序时候,在第10行提示错误信息:|

C语言 二维数组与指针笔记

今天分析了C语言二维数组和指针的基本理解,感觉有点懵...代码记录一下,如果有大神临幸发现哪里有误,欢迎指正~~~ #include <stdio.h> #include <stdlib.h> #include <string.h> //void func(int p[][]) //这样写等同于void func(int **p) p++移动了四个字节,(*p)++移动了四个字节,不符合二维数组规律 //{ //} //列优先输出的函数(即竖着输出) void func

C语言--二维数组,字符串数组,多维数组

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { // int a[2][3]={ // {1,2,3}, // {4,5,6} // }; // int a[2][3]={1,2,3,4,5,6}; // //打印单个元素 // printf("%d",a[1][1]); // //元素没赋全,默认为0 // int b[2][3]={{1,2,3},{4}}; // /

c语言二维数组传递

c语言二维数组传递,目前我总结三种方法,以及纠正一个不能使用的方法 /********************************* * 方法1: 第一维的长度可以不指定 * * 但必须指定第二维的长度 * *********************************/ void fun(int a[][3], int n, int m) { int i, j; for (i = 0; i < n; i++) { for (j = 0; j < m; j++) printf(&quo

C语言 二维数组复制、清零及打印显示

#include <stdlib.h> #include <stdio.h> #include <string.h> //二维整型数组打印显示 void printarr2d(int (*a)[3],int row,int col) { int i,j; for(i=0; i<row; i++) { for(j=0; j<col; j++) { printf("%d ", a[i][j]); } printf("\n"

C语言二维数组作业

一.PTA实验作业 题目1:7-3 出生年 1. 本题PTA提交列表 2. 设计思路 1.声明一个函数different()用来计算一个年份的不同数字个数 2.定义y(y是来计算符合要求的年份的量),n(n为题目要求的不同数字个数),x(x用来存放起始年份),flag(flag是用来表示每个y值中的不同数字个数的量) 3.输入起始年份y和题目要求的n 4.x=y(存放起始年份) 5.do {flag计算y中不同数字个数:如果flag=n,符合题意,输出相应结果,并结束循环:如果不符合,y自增一}

C语言 二维数组(指针)动态分配和释放(转)

C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按照16位.32位.64位为单位进行编辑的话:旧的16位处理器,比如Intel 80286 CPU需要8个指令,32位的处理器需要4个指令,而64位处理器则只要两个指令,显然,在工作频率相同的情况下,64位处理器的处理速度会比16位.32位的更快.而且除了运算能力之外,与32位处理器相比,64位处理器

C语言:二维数组

二维数组:元素为一维数组的数组 一维数组:数据类型 数组名称[元素个数] 二维数组:数据类型 数组名称[一维数组的个数][一维数组的元素个数]; 三维数组:数据类型 数组名称[二维数组的个数][一维数组的个数][一维数组的元素个数]; 二维数组的注意点: 如果二维数组仅仅是定义没有初始化里面的元素都是垃圾值(不确定的值) 1.先定义二维数组,然后进行初始化 注意点: 1.二维数组进行定义的同时初始化,那么没有显式初始化的元素会被自动初始化为0 2.定义二维数组的时候,必须要指定要一维数组的元素个

C语言二维数组

一 :二维数组 一维数组的每一个元素又是一个数组(数组的数组) int a[3][4],定义一个数组,有3个元素,a[0].a[1].a[2] a[0]  又是一个一维数组,有4个元素 二:二维数组的定义及注意 格式:数据类型   二维数组名[第一维的长度][第二维的长度] int arr[3][4]; 注意: 1)数组名不能和变量名重复 2)遵循标识符命名原则 3)数组的长度可以使用宏定义 4)数组的长度可以使用变量 int m,n; scanf("%d,%d",&m,&am

C语言二维数组的用法

二维数组在声明的时候可以直接全部赋值,如: int a[2][3] ={ {1,2,3}, {4,5,6} }; 不能先申明再全部赋值,如下方式是错误的: int a[2][3]; a[2][3]={ {1,2,3}, {4,5,6} };