1. 首页 > 科技

c语言关于二维数组的问题? c语言二维数组写法

c语言关于二维数组的问题?c语言二维数组写法

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[][4]所表达的意思,是指二维数组a的每一维都是由4个元素组成的一维数组.而编译器可以根据你赋给a的初值个数计算它的第一维长度(元素总个数/4,如果不能整除,则长度加1,此时还应该有几个没有赋初值的数组元素).而a[3][]的意思从表面上看可以成立,但问题是编译器不能直接识别其第二维的确切长度(你可以考虑,如果总的初值个数为2时,可以认为a的第二维长度为1,也可以是2,.......),这样就会产生错误.所以,可以a[][4]={*,*,*……}这样定义,而不能定义a[3][]={*,*,*……}。

对于你补充的问题,其实我已经讲了.因为赋初值是5个元素,所以5/4=1,但除不尽,所以要加1,即实际数组a实质上定义为a[2][4],其内元素为:

1 2 3 4

5 0 0 0 (后面的三个0是系统默认值)

希望对你有所帮助.^-^

c语言中二维数组的要点和难点

二维数组的定义和引用(理解,掌握) 7.3 字符数组(掌握) 变量与数组的实质 变量的实质是,就指的是存储单元,变量的类型就是该存储单元的类型它指明了该存储单元占几个字节,如何存入数据及存入数据的类型。变量名是为了引用变量而设置的,它的实质是该存储单元地址的别称。

用C语言实现二维数组的相关运算

我也是二年级计算机系……随便编了一下练练手

根据数据结构课程的要求:

程序应有良好的交互性,健壮性

程序比较简单,就不注释了^_^

里面用了动态分配二维数组

#include

#include

int main()

{

int n,m,**a,i,j,sum;

printf("请输入数组A[n][m]的大小\n");

printf("n=");

scanf("%d",&n);

printf("m=");

scanf("%d",&m);

if(m<=0 || n<=0)

{

printf("矩阵行列数必须大于0\n");

return 1;

}

a=(int**)malloc(n*sizeof(int*));

for(i=0;i

a[i]=(int*)malloc(m*sizeof(int));

printf("请输入数组元素\n");

for(i=0;i

for(j=0;j

{

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

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

}

for(sum=0,i=0;i

sum+=a[i][0]+a[i][m-1];

for(j=1;j

sum+=a[0][j]+a[n-1][j];

printf("\n1.A的边缘元素之和=%d\n",sum);

for(sum=0,i=0;i

for(j=i%2;j

sum+=a[i][j];

printf("\n2.从A[0][0]开始不相邻元素之和=%d\n",sum);

if(n!=m)

{

printf("\n3.只有n阶方阵才可以计算对角线之和\n");

return 2;

}

for(sum=0,i=0,j=0;i

sum+=a[i][j];

printf("\n3.主对角线元素之和=%d\n",sum);

for(sum=0,i=n-1,j=m-1;i>=0 && j>=0;i--,j--)

sum+=a[i][j];

printf("\n4.副对角线元素之和=%d\n",sum);

return 0;

}