Ⅰ c语言中,多维数组最多是多少维我们老师说最多六十维请问为什么
c语言默认最多是二维数组;当然如果用指针自己分配内存的话可以自行进行计算,进行更多维的表示。
原则上,C语言中数组所包含的元素个数理论上多少都行,如果要开一个很大的数组,比如int arrayint[10000][10000];在main()中声明该数组就会使应用程序退出,但是如果把该数组的声明放在所有函数体之外,让它变成一个全局变量,就没有任何限制了,想开多大的数组都可以。
(1)c语言计算多维数组长度扩展阅读:
如果一个变量名后面跟着一个有数字的中括号,这个声明就是数组声明。字符串也是一种数组。它们以ASCII的NULL作为数组的结束。要特别注意的是,中括号内的索引值是从0算起的。
如果一个变量声明时在前面使用 * 号,表明这是个指针型变量。换句话说,该变量存储一个地址,而 *(此处特指单目运算符 * ,下同。C语言中另有 双目运算符 *) 则是取内容操作符,意思是取这个内存地址里存储的内容。指针是 C 语言区别于其他同时代高级语言的主要特征之一。
Ⅱ c语言中,多维数组最多是多少维我们老师说最多六十维请问为什么
c语言默认最多是二维数组;当然如果用指针自己分配内存的话可以自行进行计算,进行更多维的表示。二维数组本质上是将数组作为数组元素的数组,称为数组的数组。为了形象化理解二维数组,通常将二维数组写成行和列的排列形式,通常被称为m行n列。
1、M:二维数组中包含多少个一维数组,二维数组是第一个维度,表示行;
2、N:一个一维数组中包含多少个元素,第二维,表示哪一列。
3、格式:类型修饰符数组名称[行号][列号]={值,值2,值3…};您可以保存行数,但不能保存列数。
(2)c语言计算多维数组长度扩展阅读:
高维数组:
有两个或多个下标的数组;三维数组:实体的层、行和列;
格式:类型修改器数组名称[层号][行号][列号]={值,值2,值3…};
遍历3D数组需要三层循环;高维数组访问元素:数组名称[下标][下标]…高维数组中元素的个数等于这些数的乘积;高维数组的内存占用等于元素数量乘以单个元素所占用的空间。
Ⅲ 如何动态构建多维数组(c语言)
两种方法:
1.转化为一维数组申请
2.先申请全部行首指针,再按行逐行申请
1.
a=(int *)malloc(sizeof(int),(unsigned)m*n);
使用的时候就和一般的二维数组一样。
举个例子给你:
#include "stdlib.h"
#include "stdio.h"
#include <malloc.h>
int main()
{
int i,j;
int n;//这个就是需要指定的行数
int (*p)[10];
scanf("%d",&n);//取得行数
//动态生成二维数组,指定列数为10,如果想改,自己该里面
的参数,如果想定义n行2列就为: p=(int (*)[2])malloc(n*2*sizeof(int));
p=(int (*)[10])malloc(n*10*sizeof(int)); //动态申请n行10列的二维数组
for(i=0;i<n;i++)
for(j=0;j<10;j++)
p[i][j]=i*j;
for(i=0;i<n;i++)
{
for(j=0;j<10;j++)
printf("%d,",p[i][j]);
printf("\n");
}
free(p);
return 0;
}
2.
这个也给你举个例子吧:
#include <stdio.h>
#include <malloc.h>
main()
{
int i = 0;
int j = 0;
int line = 0;
int row = 0;
int **p = NULL;
printf("input the line of the array:\n");
scanf("%d", &line);
printf("input the row of the array:\n");
scanf("%d", &row);
p = (int **)malloc(sizeof(int *) * line);
if (NULL == p)
{
return;
}
for (i = 0; i < line; i++)
{
*(p + i) = (int *)malloc(sizeof(int) * row);
if (NULL == *(p + i))
{
return;
}
}
/*input data*/
for (i = 0; i < line; i++)
{
for(j = 0; j < row; j++)
{
p[i][j] = i + 1;
}
}
/*output data*/
for (i = 0; i < line; i++)
{
for(j = 0; j < row; j++)
{
printf("%d", p[i][j]);
}
}
/*free every line point*/
for (i = 0; i < line; i++)
{
free(*(p + i));
p[i] = NULL;
}
free(p);
p = NULL;
}
第一种方法数组创建和释放都比较简单
Ⅳ c语言怎么获取数组的长度
c语言中,定义数组后可以用sizeof命令获得数组的长度(可容纳元素个数)
如:
{
intdata[4];
intlength;
length=sizeof(data)/sizeof(data[0]);//数组占内存总空间,除以单个元素占内存空间大小
printf("lengthofdata[4]=%d",length);//输出lengthofdata[4]=4
}
但,通过传递数组名参数到子函数中,以获得数组长度是不可行的。如:
intgetLength(int[]a){
intlength;
length=sizeof(a)/sizeof(a[0]);//这样是错误的,得到的结果永远是1
returnlength;
}
因为,a是函数参数,到了本函数中,a只是一个指针(地址,系统在本函数运行时,是不知道a所表示的地址有多大的数据存储空间,这里只是告诉函数:一个数据存储空间首地址),所以,sizoef(a)的结果是指针变量a占内存的大小,一般在32位机上是4个字节。a[0]是int类型,sizeof(a[0])也是4个字节,所以,结果永远是1。
因此,获得数组长度,只能在数组定义所在的代码区中,采用以上方法,才可以达到效果。
拓展资料:
数组特点:
数组是相同数据类型的元素的集合。
数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。
数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。例如,a[0]表示名字为a的数组中的第一个元素,a[1]代表数组a的第二个元素,以此类推。
对于VB的数组,表示数组元素时应注意:
下标要紧跟在数组名后,而且用圆括号括起来(不能用其他括号)。
下标可以是常量,变量,或表达式,但其值必须是整数(如果是小数将四舍五入为整数)。
下标必须为一段连续的整数,其最小值成为下界,其最大值成为上界。不加说明时下界值默认为1。
Ⅳ c语言多维数组指针求解 希望高手每行注释一下 谢谢
楼主你好~
在解释那些烦人的printf之前,我们来理清几个概念。
1),数组,这只是一种表现方式,他指的是一类已知数据类型在内存中连续排布的一种表现方式,记住这个连续排布,它是数组的本质。
2),数组的表现形式一般为a[n],不要被他的样子迷惑,事实上[]这个不应该被叫成方括号,应该是数组元素的取值运算符,例如int a[3]其实是*(a+3)的意思,而*(a+3)则表示a+3*sizeof(int),这个元素在实际内存中跳转了3*sizeof(int)的实际长度。
3),一个内存地址实际上是一连串2进制数,根据机器的架构,长度也不一样,例如80386机器,一般实际内存地址是一个32位无符号整数,注意,就是个整数,所以使用%d输出的时候是可以被输出的。
OK,理解了上面,下面的printf就很简单了:
printf("%d,",a);
printf("%d,",*a);
printf("%d,",a[0]);
printf("%d,",&a[0]);
printf("%d\n",&a[0][0]);
// 以上5个全部输出数组a的首地址,也就是a这个数组在内存中的位置,
// 楼主截图中是在内存中第1244952个位置,可以这么理解
// 按照a[n] = *( a + n),很容易算出上面各个的位置:
// 头两个不说,第三个a[0] = *(a + 0) = *a = a
// 这里注意为什么*a = a,因为a的数据类型是int**。
// 第四个&a[0] = &*(a + 0) = a
// 第五个&a[0][0] = &*(*(a+0)+0) = &*(*a + 0) = &**a = *a = a
printf("%d,",a+1);
printf("%d,",*(a+1));
printf("%d,",a[1]);
printf("%d,",&a[1]);
printf("%d\n",&a[1][0]);
// 以上几个全部输出a[1][]的首地址,也就是元素{4}的地址
// 第一个a+1,就是a的首地址+1*sizeof(int[4]),也就是
// a+1*4*sizeof(int)
// 1244952+1*4*4 = 1244968
// 其余的跟上面那一堆一样
printf("%d,",a+2);
printf("%d,",*(a+2));
printf("%d,",a[2]);
printf("%d,",&a[2]);
printf("%d\n",&a[2][0]);
// 以上几个全部输出a[2][]的首地址,也就是元素{8}的地址
// 第一个a+2,就是a的首地址+2*sizeof(int[4]),也就是
// a+2*4*sizeof(int)
// 1244952+2*4*4 = 1244984
// 其余的跟上面那一堆一样
printf("%d,",a[1]+1);
printf("%d\n",*(a+1)+1);
// 这两个跟第二堆一样
// a[1]+1也就是元素{5}的位置
// a[1]+1 = *(a+1)+1 = a + 1*4*sizeof(int) + 1*sizeof(int) =
// 1244952 + 1*4*4 + 1*4 = 1244972
printf("%d,%d\n",*(a[1]+1),*(*(a+1)+1));
// 这两个就是输出数组元素了
// *(*(a+1)+1) = *(a[1] + 1) = a[1][1] = 5
请追问~
Ⅵ c语言二维数组求长度的问题
二维数组int a[10][10]由10个一维数组int[10]构成,每个一维数组的长度都是10,总长度是100。
Ⅶ C语言多维数组
&multi[0]不等于multi[0],
multi也不等于multi[0],
multi[0]是一维指针。
multi是一个二维指针。
multi[0][0]表示一个具体的int值。
你用%u输出的结果实际上都是输出了multi[0][0]的值。
Ⅷ C语言多维数组问题
#include<stdio.h>
voidmain(){
inta[5]={1,2,3,4,5},//---逗号
b[4]={6,7,8,9};//---上一句分号结束了。b[]要重新定义;int;或者前面改成逗号
int*p,*q;//----指针也没定义
//*p=a------这种写法也是错的;p的值是一个地址;*p的值是p所对应地址的值;
p=a;//把a的地址给p
q=b;//同上
p+=2;//p+2;地址向后移两位;指向a[2];
q+=3;//同上;指向b[3]----9
*p=*(q)+3;//a[2]=b[3]+3----12
q--;//指向b[2]
*(q-1)=*(p+1)-5;//前面还使用了中文括号;b[1]=a[2+1]-5
printf("%d,%d ",*p,*q);//*p=a[2]=12;*q=b[2]=8
}
……
Ⅸ 求C语言关于多维数组的详细讲解,急!!!
每一个[]代表一个方向 当然三维以上的数组不太容易用实体模式想象 但大概方式是一样的
先搞明白1 2 3维对应于下标的方式 指针 地址的对应关系
比如对于int a[2][3][4]而言
a[1] a[1][1] a[1][1][1] a[1][1][3] a[1][2][0]
搞清以上几项的地址关系
组数基本我们可以按行读来理解[具体对应于代码]
即 1维 从左向右读
2维 a[2][3] 从左向右工a[][0]~a[][2] 3格 成为一行 每一行对应一个a[]
三维a[4][2][3]的在此基础上增加到4个层面 (原来的2维对应为2*3格的一个面)
Ⅹ C语言 代码 求解 多维数组和指针。
假如你这样写*((p+1)+1);你觉得对吗?p+1是指a数组的第二行起始地址,*(p+1)才是指第二行第0列的地址,*(*(p+1)+1)第一个1是以一维数组的长度为单位的,既p每加1,地址就增加3个int字节,而第二个1就是以一个int字节移动的。
*(4+1)这里的*是不是应该理解为四则运算里面的乘号,前面应该还有个被乘数吧。