1. 首页 > 科技

C语言二维数组问题? c语言二维数组写法

C语言二维数组问题?c语言二维数组写法

C语言上机题:二维数组问题

#include

const int inf=(1<<30); //这是表示无限大,不这么考究的话就直接赋值999999

#include

int main(){

int arr[3][4];

int minRow[3] = {inf ,inf ,inf};

int maxCol[4] = {0};

for(int i = 0; i < 3; i ++){

for(int j = 0; j < 4; j ++){

scanf("%d", &arr[i][j]);

}

}

for(int i = 0; i < 3; i ++){

for(int j = 0; j < 4; j ++){

printf("%d ", arr[i][j]);

if(arr[i][j] < minRow[i]){

minRow[i] = arr[i][j];

}

if(arr[i][j] > maxCol[j]){

maxCol[j] = arr[i][j];

}

}

printf("\n");

}

for(int i = 0 ;i < 3 ; i++ ){

printf("第%d行的最小值为: %d\n", i+1, minRow[i]);

}

for(int j = 0 ;j < 4 ; j++ ){

printf("第%d列的最大值为: %d\n", j+1, maxCol[j]);

}

return 0;

}

C语言:二维数组的问题

你要给出fun()的原型(应该知道函数的原型吧~~)

另外你是如何调用~~?

不知你有没有耐心看完,但是我建议你看一下,我敲了好久。希望对你和其他看到这个答案的人有帮助,这是在总结我的学习实践经验而写的。

1.对数组的理解——数组=指针+最大偏移量

对于一个数组,数组名被解析为指针,而下标(不管多少)解析为偏移量,

比如 char z[4]={'a','b','c','d'};下面是内存分布

---

|a|<------z

---

|b|

---

|c|

---

|d|

---

1.1.用数组的概念来理解:

当我们想调用其中某个字符时,可以这样写z[i](i为0、1、2、3).

z[0]代表第一个,z[1]代表第二个,依次类推

2.2.用指针来理解

从内存分布图可以看出z就是一个指针,和指针相关的一个名词是“偏移量”,

事实上数组的下标就是指针的偏移量

比如z[0]被解析为 *(z+0) 也就是第一个字符a

z[1]被解析为 *(z+1) 即对z指针偏移一个单位,再进行解除引用(*是c或c++里面对指针解除引用的符号),也就是第二个字符b

3.历史回顾——解释为什么调用是z[0]表示第一个,而不是z[1]是第一个?

指针是很古老的概念了,而数组的引进可以,事实上是指针的一种变形,古老的程序员喜欢指针,当然肯定涉及到偏移量这个概念。

这也就解释了为什么数组第一个要从0排起,而不是从1排起。

4.数组的信息就是指针+偏移量,所以一个完整的数组的信息应该包含指针及偏移量的多少。

所以作为参数时,一般都把数组名(指向数组的指针)和数组长度(最大偏移量)作为形参,

我们把上面的数组z传入一个函数

函数原型: int func(char arry[],int index);

由于一维数组的数组名事实上是指向数组类型的指针,在这里是指向char类型的指针

因此函数原型可以是:int func(char *arry,int index);

在使用该函数时这样写就可以了,func(z,4)//index=4,数组长度

上面是等效的。

5.对于多维数组,关系到一些更恐怖的概念,比如指向指针的指针,我就不多说了,这些是非一两句话可以搞定的。

但是和一维数组一样,传递参数时要包含整个数组的信息。

下面是一个例子

int a[2][5]={1,2,3,4,5,6,7,8,9,0};

//这个函数输出数据a所有的内容

fun(int **arry,int x,int y) //对于数组作为参数,一般都要把下标作为参数

//我个人比较喜欢用**a,而不喜欢用a[][],一些国外权威书籍也是这样介绍

{

int i,j;

for(i=0;i

{

for(j=0;j

{

cout<

}

cout<

}

}

这样调用fun(a,2,5);

输出的结果是

1 2 3 4 5

6 7 8 9 0

6.一个有趣的现象——建议自己动手试一下

高手级知识,一般人是不知道的(有点在自卖自夸……:-D)

上面说到 z[0]被解析为 *(z+0),那么能不能这样想

(<===> 是可以互相转换的意思)

z[0] <===> *(z+0) <===> *(0+z) <===> 0[z]

那么发现z[0]可以转换为0[z]!

事实就是如此:

对于上面的z[4]我们在输出时这样写

cout<

下面的写法是等效的

cout<<0[z]<<1[z]<<2[z]<<3[z]<

有趣吧O(∩_∩)O

自己试一下吧。

OK,该去吃饭了,写了这么久,希望对看到的人有帮助

关于C语言定义二维数组的问题

以下能正确定义二维数组的是 -- 以下能正确定义 数组的是 (去掉二维两字)。

A) int a[ ][3]; -- 语法错,没带初始化,不允许用 [空白],不允许 数组大小不定。

B) int a[ ]={2*3} -- 正确定义了数组,是一维数组,数组元素只有1 个,初始化数值为 2*3 ,就是 6。

C) int a[ ][3]={ }; -- 语法错,花括号里没填初始化数值。

D) int a[2][3]={{1},{2},{3,4}}; -- 语法错,数组声明为2行3列,却初始化为3行2列。 如果是 int a[3][2]={{1},{2},{3,4}}; 语法就正确了。

所以答案是 B

C语言的二维数组问题

更正:选D,其他说明不变,只是没注意看题目,经♂Ёdīιу提醒才发现

静态声明的二维数组的存储是连续的

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

那么它在内存里的实际存储其实就是1 2 3 4

这4个空间前后连续

所以定位一个m行n列的二维数组中的某个元素的位置,可以使用线性下标来访问

比如a[i][j]在一个n列的二维数组里的位置就是i*n+j

拿刚才那个例子来看

a[0][0]就是0*2+0 = 0,相当于一维数组的第1个元素

a[1][0]就是1*2+0 = 2,相当于一维数组的第3个元素

所以第i行j列的元素相当于它对应的一维数组里下标为i*n+j的元素,如果第一个元素以位置1来算的话,也就是数组里的第i*n+j+1个位置