㈠ c语言多维数组定义与初始化
二维数组定义的一般形式如下:
类型标识符 数组名【常量表达式1】【常量表达式2】;
例如:
int a[2][3];
float b[3][10];
二维数组的初始化有两种:
(1)分行初始化,如:
static int a[2][3]={{1,2,3,},{4,5,6}};
(2)统一初始化,如:
static int a[2][3]={1,2,3,4,5,6};
㈡ C语言多维数组的赋值
循环,或者定义的时候赋值~
㈢ C语言如何定义一个N行N列的二维数组任意输入数据
我可以肯定的告诉你,不可能在程序运行的时候决定一个二维数组的大小,因为数组的大小是
在编译时就决定了的,不是在运行时,如果是一维的通过某些方法还可以办到,二维的就不可
能了,拿一维的来说:
polly@nowthen:~$cattest.c
#include<stdio.h>
#include<stdlib.h>
structtest{
intnum;
intarr[0];
};
intmain()
{
structtest*temp;
intn=0;
scanf("%d",&n);
if(n>0){
temp=(structtest*)malloc(sizeof(structtest)+n*sizeof(int));
temp->num=n;
inti=0;
for(;i<temp->num;i++){
temp->arr[i]=i;
}
for(i=0;i<temp->num;i++){
printf("element%d=%d ",i,temp->arr[i]);
}
}
return0;
}
polly@nowthen:~$gcc-Walltest.c-oliu<---编译
polly@nowthen:~$./liu<---运行
9<---输入数组维数
element0=0
element1=1
element2=2
element3=3
element4=4
element5=5
element6=6
element7=7
element8=8
polly@nowthen:~$
就上面的C语言标准也是不支持的,多维数组的办不到,一维的也尽量少用。
㈣ 如何动态构建多维数组(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语言的多维数组怎么嵌套定义,以及怎么赋值
1、使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小。
2、例程,分配3行4列二维数组:
#include<stdio.h>
#include<malloc.h>
intmain()
{
int**a;
inti,j;
a=(int**)malloc(sizeof(int*)*3);//为二维数组分配3行
for(i=0;i<3;++i){//为每列分配4个大小空间
a[i]=(int*)malloc(sizeof(int)*4);
}
//初始化
for(i=0;i<3;++i){
for(j=0;j<4;++j){
a[i][j]=i+j;
}
}
//输出测试
for(i=0;i<3;++i){
for(j=0;j<4;++j){
printf("%d",a[i][j]);
}
printf(" ");
}
//释放动态开辟的空间
for(i=0;i<3;++i){
free(a[i]);
}
free(a);
return0;
}
/*
输出:
0123
1234
2345
*/
㈥ 求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格的一个面)
㈦ 数组的定义是什么
1.数组的定义数组是由n(n≥1)个具有相同类型的数据元素a0,a1,a2,…,an-1组成的有序序列,且该序列必须存储在一块地址连续的存储单元中,并用一个统一的数组名标识。
2.数组的特点(1)数组中的数据元素具有相同数据类型。
(2)数组是一种随机存取结构,给定数组下标,就可以访问与其对应的数据元素。
(2)数组可被看成定长的线性表,因此数组中的数据元素的个数是固定的。
2.数组分类根据数组元素ai的组织形式的不同,数组可分为一维数组、二维数组以及多维数组。
1.一维数组一维数组可被看成一个线性表或一个向量,它在计算机内存放在一块连续的存储单元中,在C语言中一维数组一般定义为:数组名[下标]。
2)二维数组若一维数组中的数据元素又是一维数组结构,则称为二维数组。在二维数组中,每个数据元素aij对应一个行下标和一个列下标。因此,除边界元素外,每个元素aij都恰好有两个直接前驱aij-1和ai-1j,两个直接后继aij+1和ai+1j。开始结点a11没有前驱结点,终端结点amn没有后继结点,边界上的结点a1j(1≤j<n)、amj(1≤j<n)、ai1(1≤i<m)和ain(1≤i<m)均只有一个后继结点或一个前驱结点,也可被看成线性表的线性表。因此,二维数组的逻辑结构是:每个元素至多有两个直接前驱和两个直接后继。在C语言中,二维数组一般定义为:数组名[下标][下标]。
2)n维数组在n维数组中,每个数据元素对应n个下标,受n个关系的制约,其中任一个关系都是线性关系,也可被看作数据元素为n-1维数组的一维数组。在C语言中多维数组一般定义为:
数组名[下标]…[下标],有几个下标就是几维数组。
4.数组的基本操作数组在创建时就确定了组成该结构的行向量数目和列向量数目,因此,在数组结构中不存在插入、删除元素的操作。因此,除了初始化和销毁之外,数组通常只有两种操作:
(1)存取(读):给定一组下标,读取相应的数据元素。
(2)修改(写):给定一组下标,存取或修改相应的数据元素。
㈧ C语言多维数组
&multi[0]不等于multi[0],
multi也不等于multi[0],
multi[0]是一维指针。
multi是一个二维指针。
multi[0][0]表示一个具体的int值。
你用%u输出的结果实际上都是输出了multi[0][0]的值。
㈨ 定义数组 int x[4][]={{1,2,3},{1,2,3},{1,2,3},{1,2,3}} int x[][3]={1,2,3,4}
你的理解有一半是对的,有一半是错的。对的就是你明确了两个数组都是不确定的,错的就是你误以为0可以有无限个。
你要知道第一维度和第二维度都代表什么。前面代表数组有几行,后面代表每行有几个元素。
如果int [][3] = {1,2,3}那么系统知道了每行有几个,就可以确定数组为a[1][3];
如果int [][3] = {1,2,3,4};那么系统就确定数组为a[2][3]= {1,2,3,4,0,0};0的个数就可以被确定了。
但是如果是int [4][]={1,2,3}那么系统就不知道每行有几个,就没法确定有几个0了。
你可以试试直接定义a[]={1,2,3};是可以的。相当于a[3];
㈩ 关于c语言多维数组问题
我很赞同你的理解,你学得挺扎实。你的3个问题都很好👍👍
下面只是我个人的一些看法:
1、关于二维数组的表示方式,c语言从没有见过a[0..m][0..n]这种表示方法,因为语言本身的原因,造成a[m][n]数组不含有a[m][n]这个元素,很奇特吧!所以明确的表达方式是:int a[m][n],但其下标却是0...m-1和0...n-1。那么,a[0..m][0..n]是否就代表(m+1)行(n-1)列数组呢,若是,你的三个问题都是肯定的结果。
2、如果a[0..m][0..n]与int a[m][n]等价呢?这不是没有可能的,因为没有规定不能这样表示。这样的话,你的三个问题都是否定的结果。而且选项A是正确的。
3、造成这种情况的根本原因,是这本书使用了不严谨的表达方式,看起来不像是印刷错误,应该是编书人的失误。