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,该去吃饭了,写了这么久,希望对看到的人有帮助 以下能正确定义二维数组的是 -- 以下能正确定义 数组的是 (去掉二维两字)。 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 更正:选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个位置关于C语言定义二维数组的问题
C语言的二维数组问题