㈠ 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語言,多維數組在內存中的排列是先排第一行再排第二行,那每行有幾個元素啊
誰告訴你多維數組在內存中是以多維呈現的?
內存是一維線性的, 不可能會排出平面, 立體, 甚至是動態的.
多維數組還是一維數組, 只不過它的元素不一樣.
二維數組其實是, 一維數組中的每個元素, 還是一個一維數組.
就像文件夾里套一個文件夾.