㈠ c语言中二维数组在内存中是按什么优先存放的
C语言中
二维数组是按行优先存储的
即 在内存中存一个二维数组时 先把数组中第一行的数组元素存完 再接着存下一行的 直到存完。
ps:定义一个二维数组 如 int a[m][n] 该数组为m行 n列的矩阵,在内存中 这样顺序存的:
a[0][0] a[0][1] ... a[0][n-1] a[1][0] a[1][1]...
不知道是不是帮到你的忙了
望采纳
㈡ 在c语言二维数组中,a【0】为什么是第一行的第一个元素,列不是不能缺省吗,那a【0】不应该是第一列
我们知道数组是代表一行,但数组实际是一个地址,指向首元素,同样道理,a[0]逻辑上指的是第一行,实际指向第一行首元素,也就是整个二维数组的首元素。a指的是整个二维数组,实际指向第一行,所以又称a为行指针,也叫数组指针。但是不论是a[0]还是a其所指的都是第一个元素,也就是a[0][0]的地址。其逻辑上的区别仅在指针加1时能体现出来。
例如 printf("%p",a+1);和printf("%p",a[0]+1);结果时不同的。
㈢ C语言 如何对二维数组进行按列排序
无论是多少维的数组,机内都是一维的,以行优先存放。所以直接降为一维数组排序最方便省事。下面以二维数组为例写出代码——
#include"stdio.h"
intmain(intargc,char*argv[]){
intx[3][3]={{9,4,3},{6,2,7},{5,8,1}},i,j,k,*p;
printf("Beforeorderingisasfollows: ");
for(i=0;i<3;i++){
for(j=0;j<3;printf("%2d",x[i][j++]));
printf(" ");
}
for(p=(int*)x,i=0;i<9;i++){//用p=(int*)x将x降为一维数组p,选择法排序
for(k=i,j=k+1;j<9;j++)
if(p[k]>p[j])
k=j;
if(k!=i)
j=p[k],p[k]=p[i],p[i]=j;
}
printf("Sortedasfollows: ");
for(i=0;i<3;i++){//输出排序后的二维数组
for(j=0;j<3;printf("%2d",x[i][j++]));
printf(" ");
}
return0;
}
运行结果:
㈣ 在C语言中,二维数组元素在内存中的存放顺序是 A按行存放 B按列存放 C由用户自己定义 D由编译器决定
c语言中,二维数组元素在内存中是按行存放的。
二维数组本质上是以数组作为数组元素的数组,即“数组的数组”,类型说明符 数组名[常量表达式][常量表达式]。二维数组在概念上是二维的,即是说其下标在两个方向上变化, 下标变量在数组中的位置也处于一个平面之中, 而不是象一维数组只是一个向量。
但是,实际的硬件存储器却是连续编址的, 也就是说存储器单元是按一维线性排列的。如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列, 即放完一行之后顺次放入第二行。另一种是按列排列, 即放完一列之后再顺次放入第二列。在C语言中,二维数组是按行排列的。
例如:float a[3][4],b[5][10]; 定义a为3*4(3行4列)的数组,b为5*10(5行10列)的数组。注意,不能写成 float a[3,4],b[5,10]; 具体可以表示:a[3][4]={ {1,2,3,4},{5,6,7,8},{9,10,11,12} }
(4)c语言中二维数组先排行还是列扩展阅读:
1、表示方法:
数组元素也是一种变量, 其标识方法为数组名后跟一个下标。下标表示了元素在数组中的顺序号。数组元素的一般形式为:数组名[下标] 其中的下标只能为整型常量或整型表达式。如为小数时,C编译将自动取整。例如,a[5],a[i+j],a[i++]都是合法的数组元素。数组元素通常也称为下标变量。必须先定义数组, 才能使用下标变量。
2、赋值方法:
初始化赋值的一般形式为:static类型说明符数组名[常量表达式]={值,值……值}; 其中static表示是静态存储类型, C语言规定只有静态存储数组和外部存储数组才可作初始化赋值。在{ }中的各数据值即为各元素的初值, 各值之间用逗号间隔。例如:static int a[10]={ 0,1,2,3,4,5,6,7,8,9 }; 相当于a[0]=0;a[1]=1...a[9]=9;
3、使用规则:
一、数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。
二、数组名的书写规则应符合标识符的书写规定。
三、数组名不能与其它变量名相同。
四、可以只给部分元素赋初值。当{ }中值的个数少于元素个数时,只给前面部分元素赋值。例如:static int a[10]={0,1,2,3,4};表示只给a[0]~a[4]5个元素赋值,而后5个元素自动赋0值。
五、只能给元素逐个赋值,不能给数组整体赋值。例如给十个元素全部赋1值,只能写为:static int a[10]={1,1,1,1,1,1,1,1,1,1};而不能写为:static int a[10]=1;(请注意:在C、C#语言中是这样,但并非在所有涉及数组的地方都这样,数据库是从1开始。)
六、若不给可初始化的数组赋初值,则全部元素均为0值。
七、假如给全部元素赋值,则在数组说明中, 可以不给出数组元素的个数。例如:static int a[5]={1,2,3,4,5}; 可写为:static int a[]={1,2,3,4,5};动态赋值可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合scanf函数逐个对数组元素赋值。
参考资料来源:网络-二维数组
网络-数组
㈤ c语言,二维数组排序
别分行列了,都放在一起,用冒泡排序,二维数组跟一位数组,在你这种情况下,区别不大
㈥ c语言给定二维整型数组先对每行从小到大排序,后对每列从小到大排序反复执行,每行不低于3列不低于4
二维数组我直接赋的初值。数组的行数和列数你改常量就行了。
你想手动输入数组值,你自己写一个输入就行了。
代码功能:先对每行进行一次升序排列,再对每列进行一次升序排列。无限循环直到数组不再发生变动。
也就是说,至少会有两轮行列排序检测。
#include<stdio.h>
#include<malloc.h>
#definerow3
#defineclo4
intpx(int**ns,intlen);//对数组升序排列
voidprintfNUMS(int*nums,intr,intc);//打印数组
intmain()
{
inti,j,flag=0,cnt=0,nums[row][clo]={{4,6,2,8},{4,8,3,2},{9,8,6,4}},**ns=NULL;
printf("原始的数组:
");
printfNUMS(&nums[0][0],row,clo);
while(1)
{
flag=0;
cnt++;
ns=(int**)malloc(sizeof(int*)*clo);
if(!ns)
{
printf("内存错误!
");
return1;
}
printf("第%d次对分别对行列进行升序排列
",cnt);
for(i=0;i<row;i++)//对每行进行排序
{
for(j=0;j<clo;j++)
ns[j]=&nums[i][j];
if(px(ns,clo))
flag=1;
}
printf("--每行进行一次排序,数组变成:
");
printfNUMS(&nums[0][0],row,clo);
free(ns);
ns=(int**)malloc(sizeof(int*)*row);
if(!ns)
{
printf("内存错误!
");
return1;
}
for(i=0;i<clo;i++)//对每列进行排序
{
for(j=0;j<row;j++)
ns[j]=&nums[j][i];
if(px(ns,row))
flag=1;
}
printf("--每列进行一次排序,数组变成:
");
printfNUMS(&nums[0][0],row,clo);
printf("
");
if(!flag)
break;
}
printf("数组行列均已实现升序排列!程序结束
");
return0;
}
voidprintfNUMS(int*nums,intr,intc)//打印数组,传参首地址
{
inti,j;
for(i=0;i<r;i++)//对每行进行排序
{
for(j=0;j<c;j++)
printf("%d",*nums++);
printf("
");
}
}
intpx(int**ns,intlen)//对数组(指针数组)升序排列,如果发送交换返回1,没有返回0
{
inti,j,flag=0;
for(i=0;i<len;i++)
for(j=i+1;j<len;j++)
if(*ns[i]>*ns[j])
*ns[i]^=*ns[j],*ns[j]^=*ns[i],*ns[i]^=*ns[j],flag=1;
returnflag;
}
㈦ 在C语言中,二维数组元素在内存中的存放顺序是____。(
在c语言里二维数组元素在内存中是按行存放的。
二维数组A[m][n],这是一个m行,n列的二维数组。设a[p][q]为A的第一个元素,即二维数组的行下标从p到m+p,列下标从q到n+q,按“行优先顺序”存储时则元素a[i][j]的地址计算为:
LOC(a[i][j]) = LOC(a[p][q]) + ((i − p) * n + (j − q)) * t;
按“列优先顺序”存储时,地址计算为:
LOC(a[i][j]) = LOC(a[p][q]) + ((j − q) * m + (i − p)) * t;
存放该数组至少需要的单元数为(m-p+1) * (n-q+1) * t 个字节。
(7)c语言中二维数组先排行还是列扩展阅读
C++动态二维数组:
以整形为例,row为行数,col为列数
int **data;//存储二维数组的指针(指向指针的指针。date=x[0][0]的地址。这样标会更好。因为sizeof(date)结果为4不可能存下二维数组)。
//以下实现如何申请内存
data = new int *[row];
for (int k = 0; k < row; k++)
{
data[k] = new int[col];
}
//赋值跟普通二维数组一样 例如
data[0][0] = 5; //将二维数组1行1列(C++中称为0行0列)赋值为5
//删除内存
for (int i = 0 ; i < row; ++i)
{
delete [] data[i]; //此处的[]不可省略
}
delete [] data;
㈧ 二维数组元素的存放顺序在C语言中是按行排列还是按列
按行,其实在内存中的数据就为一行,a[0][n]后是a[1][0]。以此类推~
㈨ c语言,多维数组在内存中的排列是先排第一行再排第二行,那每行有几个元素啊
谁告诉你多维数组在内存中是以多维呈现的?
内存是一维线性的, 不可能会排出平面, 立体, 甚至是动态的.
多维数组还是一维数组, 只不过它的元素不一样.
二维数组其实是, 一维数组中的每个元素, 还是一个一维数组.
就像文件夹里套一个文件夹.