设有整型二维数组a[3][4]如下:
0   1   2   3
4   5   6   7
8   9  10  11 
它的定义为:
    int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}
设数组a的首地址为1000,各下标变量的首地址及其值如图所示。

前面介绍过,C语言允许把一个二维数组分解为多个一维数组来处理。因此数组a可分解为三个一维数组,即a[0]、a[1]、a[2]。每一个一维数组又含有四个元素。

例如a[0]数组,含有a[0][0],a[0][1],a[0][2],a[0][3]四个元素。

更多的见: http://c.biancheng.net/cpp/html/79.html

数组及数组元素的地址表示如下:从二维数组的角度来看,a是二维数组名,a代表整个二维数组的首地址,也是二维数组0行的首地址,等于1000。a+1代表第一行的首地址,等于1008。如图:

int array[3][3];

array的类型既不是int **

更不是(int *a)[4]

而是int [3][3]

只是作为右值时才转换成

int (*a)[4] a是指向一个有4个元素的数组的指针,事实上这个a此时指向a[0],指向数组,就是说a里保存着数组的地址,就是1000

指针数组与数组指针

指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针

数组指针:a pointer to an array,即指向数组的指针

还要注意的是他们用法的区别,下面举例说明。

int* a[4]     指针数组

表示:数组a中的元素都为int型指针

元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于*

int (*a)[4]   数组指针

表示:指向数组a的指针

元素表示:(*a)[i]

#include <iostream>

using namespace std;

int main()

{

int c[4]={1,2,3,4};

int *a[4]; //指针数组

int (*b)[4]; //数组指针

b=&c;

//将数组c中元素赋给数组a

for(int i=0;i<4;i++)

{

a[i]=&c[i];

}

//输出看下结果

cout<<*a[1]<<endl; //输出2就对

cout<<(*b)[2]<<endl; //输出3就对

return 0;

}

(int *array)[N] 和int **的区别

Int ** p,就是一个指针,这个指针指向了int* 也就是一个整型数组,p是指向了整数数组的指针,p中是整数数组的地址,(int *array)[N] 和int **的区别就在于每行的元素个数固不固定

传递二维数组参数

int func(int **array, int m, int n) {

...

printf("\t%d", *(*array +i*n +j));

...

}

int main() {

  int array[3][3] = {

{1,2,3},

{4,5,6},

{7,8,9}

};

...

func(array,3,3);

 ...

}

这样传递二维数组是错的,因为类型不匹配,是因为数组实际类型是int [3][3],在作为右值时可以被转化为int (*)[3],它们都和int **不同,自然不可用。

法一 直接使用数组类型:因为数组实际类型是int [3][3]

可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如:

void Func(int array[3][10]);

void Func(int array[][10]);

二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:

void Func(int array[][]);

因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多 少列,不能只指定一维而不指定第二维

法二.一维数组指针作为形参

void func2(int (*pArray)[10])

{

}

void func2_1(int (*pArray)[]) //编译通过,无法调用

{

}

int main()

{

int array[10][10];

func2(array);

}

把array[0] 数组的指针传给了func2 因为array是指向10个元素的数组的指针,(*array)就是array[0],(*array)[0] 就是array[0][0]

法三.二维数组引用作为形参

void func3(int (&pArray)[10][10])

{

}

int main()

{

int array[10][10];

func3(array);

}

以下是一维数组引用的例子

#include <iostream>

using namespace std;

void output(int (&a)[5])

{

for(int i = 0; i < 5; i++)

cout<<a[i]<<endl;

}

int main()

{

int a[5]={0};

output(a);

getchar();

return 0;

}

法四。二维数组指针作为形参

void func4(int (*pArray)[10][10])

{

}

int main()

{

int array[10][10];

func4(&array);

}

C语言二维数组作为函数参数的更多相关文章

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

    前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: #include < ...

  2. C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)

    一级指针 int *p;            //表示定义一个int型(4字节)的指针p &p                 //表示p自身的地址位置 p                  ...

  3. C语言中将二维数组作为函数参数来传递

    c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include <stdio.h> void func(int n, char ...

  4. C语言学习笔记 (005) - 二维数组作为函数参数传递剖析

    前言 很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错: //对于一个2行13列int元素的二维数组 //函数f的形参形式 f(int daytab[2][13]) {...} / ...

  5. C语言中如何将二维数组作为函数的参数传递

    今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ...

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

    C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按 ...

  7. c语言二维数组传递

    c语言二维数组传递,目前我总结三种方法,以及纠正一个不能使用的方法 /********************************* * 方法1: 第一维的长度可以不指定 * * 但必须指定第二维 ...

  8. [语法]C语言中二维数组做输入参数

    C语言中二维数组做输入参数时, 可以同时指定各维长度, 可以只指定第二维的长度, 不可以只指定第一维的长度, 不可以各维长度都不指定. 一句话总结:要指定至少指定第二维,都不指定是不行的. 具体栗子如 ...

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

    #include <stdlib.h> #include <stdio.h> #include <string.h> //二维整型数组打印显示 ],int row, ...

随机推荐

  1. Robot Framework基础学习(一)

    Robot Framework语法学习: 一.变量的声明.赋值与使用 1.变量标识符:每个变量都可以用  变量标识符 ${变量名} 来表示. 2.变量声明:可以在TestSuite上点右键或者在Edi ...

  2. 20个Flutter实例视频教程-第11节: 一个不简单的搜索条-2

    博客地址: https://jspang.com/post/flutterDemo.html#toc-1b4 视频地址:https://www.bilibili.com/video/av3970929 ...

  3. python3 封装之property 多态 绑定方法classmethod 与 非绑定方法 staticmethod

    property 特性 什么是特性property property 是一种特殊的属性,访问它时会执行一段功能(函数),然后返回值 例如 BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而 ...

  4. 计算机图形学DDA画线法+中点画线法+Bresenham画线法

    #include <cstdio> #include <cstring> #include <conio.h> #include <graphics.h> ...

  5. CSS3 制作魔方 - 玩转魔方

    在上一篇<CSS3 制作魔方 - 形成魔方>中介绍了一个完整魔方的绘制实现,本文将介绍魔方的玩转,支持上下左右每一层独立地旋转.先来一睹玩转的风采. 1.一个问题 由于魔方格的位置与转动的 ...

  6. Weekly Contest 78-------->810. Chalkboard XOR Game

    We are given non-negative integers nums[i] which are written on a chalkboard.  Alice and Bob take tu ...

  7. plt

    设定X,Y轴的长度以及刻度的方法. import numpy as np import matplotlib.pyplot as plt data = np.arange(0,1.1,0.01) pl ...

  8. HTTP1.1规范下载 6个文档组成

  9. simhash与重复信息识别

    在工作学习中,我往往感叹数学奇迹般的解决一些貌似不可能完成的任务,并且十分希望将这种喜悦分享给大家,就好比说:“老婆,出来看上帝”…… 随着信息爆炸时代的来临,互联网上充斥着着大量的近重复信息,有效地 ...

  10. R 语言中 data table 的相关,内存高效的 增量式 data frame

    面对的是这样一个问题,不断读入一行一行数据,append到data frame上,如果用dataframe,  rbind() ,可以发现数据大的时候效率明显变低. 原因是 每次bind 都是一次重新 ...