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,该去吃饭了,写了这么久,希望对看到的人有帮助 首先你要理解二维数组的真正含义,它的第一维就是一组数据的起始地址,第二维就是某组数据中的某个值.其次,你要知道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是系统默认值) 希望对你有所帮助.^-^ 二维数组的定义和引用(理解,掌握) 7.3 字符数组(掌握) 变量与数组的实质 变量的实质是,就指的是存储单元,变量的类型就是该存储单元的类型它指明了该存储单元占几个字节,如何存入数据及存入数据的类型。变量名是为了引用变量而设置的,它的实质是该存储单元地址的别称。 我也是二年级计算机系……随便编了一下练练手 根据数据结构课程的要求: 程序应有良好的交互性,健壮性 程序比较简单,就不注释了^_^ 里面用了动态分配二维数组 #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; }c语言关于定义二维数组的问题
c语言中二维数组的要点和难点
用C语言实现二维数组的相关运算