c語言二維數組動態
『壹』 c語言如何動態創建二維數組
既然是動態創建,那麼,所創建的二維數組的行、列數應該具有「普適」性,即,應由「用戶」確定二維數組的規模。這是有難度的。因為,二維數組要牽扯行指針,且需要固定每行的列元素個數,用這種思路就沒有辦法達到「普適」。
為此,必須清醒地知道,所謂二維數組,其元素在內存中依然是以一維的方式存放的。說實話,二維數組本質上是不存在的。
既然如此,那麼,「構造」一個所謂的二維數組,只要能提供足夠實用的函數(工具)操作這個二維數組就可以了。
綜上,接受由用戶決定的二維數組行、列值,申請一個一維數組的空間,按照二維數組方式進行定位和操作就可以了。
為簡便起見,我用如下定義,你可以更改裡面的類型,以適應自己的需要:
typedef int USER_TYPE;
// 定義一個控制二維數組(矩陣)的「控制頭」,由三個成員組成
typedef struct MATRIX
{
USER_TYPE *data; // 真正用來存儲二維數組元素的空間
int Row; // 二維數組行數
int Col; // 二維數組列數
}MATRIX;
MATRIX *initMatrix(int row, int col); // 初始化二維數組
USER_TYPE getElementAt(MATRIX matrix, int i, int j); // 取得指定下標的元素
void setElementAt(MATRIX matrix, int i, int j, USER_TYPE val); // 給指定下標的元素賦值
void destroyMatrix(MATRIX *matrix); // 銷毀二維數組
void destroyMatrix(MATRIX *matrix)
{
free(matrix->data);
free(matrix);
}
void setElementAt(MATRIX matrix, int i, int j, USER_TYPE val)
{
matrix.data[i*matrix + j] = val;
}
USER_TYPE getElementAt(MATRIX matrix, int i, int j)
{
return matrix.data[i*matrix.Col + j];
}
MATRIX *initMatrix(int row, int col)
{
MATRIX *mp;
mp = (MATRIX *)malloc(sizeof(MATRX));
mp->data = (USER_TYPE *)malloc(sizeof(USER_TYPE) * row * col);
mp->Row = row;
mp->Col = col;
return mp;
}
把上面的函數當成工具,完成二維數組初始化、賦值、取值等一系列操作,如果需要比較,還需要編寫比較的函數。
『貳』 C語言 如何動態創建二維數組
這樣的方法可行,不過要是題目要求輸入m和n,然後再定義二維數組a[m][n],那就行不通了。
你可以這樣做:(以int型為例)
int **a;
int m,n,i;
scanf("%d%d",&m,&n);
a=(int**)malloc(m*sizeof(int*)); /*malloc函數在stdlib.h裡面,用的時候加入這個頭文件*/
for(i=0;i<m;i++)
a[i]=(int*)malloc(n*sizeof(int));
/*這樣以後你就可以把a當作二維數組a[m][n]來用了。。
『叄』 C語言中如何定義動態二維數組並輸出
使用malloc函數,先分配第一維的大小,然後再循環分配每一維的大小。
示例代碼,分配3行4列二維數組:
#include <stdio.h>#include <malloc.h> int main(){ int **a; int i, 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 ("\n"); } //釋放動態開辟的空間 for (i = 0; i < 3; ++i){ free(a[i]); } free(a); return 0;}/*輸出:0 1 2 31 2 3 42 3 4 5*/
『肆』 C語言如何給用函數二維數組動態賦值
二維數組名不能直接傳給二級指針,應該按以下方式使用:
int nChoose;
scanf("%d", &nChoose); // 讓用戶輸入二維數組的大小
int **a = (int **)malloc(nChoose * sizeof(int *));
for (int i = 0; i < nChoose; i ++)
{
a[i] = (int *)malloc(nChoose * sizeof(int));
}
Scan(a, nChoose);
Calc(a, nChoose);
// 最後要釋放數組,也要循環
『伍』 C語言如何動態分配二維數組
動態分配二維數組:
void main(int argc, char * argv[])
{
int NC=100, NR=200;
int i,j;
char **a; // a[NR][NC] -- *a[NR] -- a[j][i]
a = (char **) malloc(sizeof(char *) * NR);
for (j=0;j<NR;j++){
a[j] = (char *) malloc(sizeof(char) * NC);
}
// 釋放空間: free(a);
編譯錯誤是因為p[j]=(char *)malloc,而不是題目的(char *)malloc(n*sizeof(char))。
(5)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 個位元組。
『陸』 c語言 動態二維數組
int fun(int m,int n)
{
a=(int**)malloc(m*sizeof(int*));
if(a==NULL) return -1;
for(i=0;i<n;i++)
{
a[i]=(int*)malloc(n*sizeof(int));
if(a[i]==NULL) return -1;
}
}
上面的代碼來看,明顯是誤筆了!
for(i=0; i<n; i++) --> for(i=0; i<m; i++)
這樣才是對的,因為a的元素個數你申請的是m個,而不是n個。這樣的代碼,在n<=m的情況下運行是不會出錯了,當n>m時,那麼就有許多你不可預料的事情發生了!
希望可以幫到你。
『柒』 C語言中如何定義動態二維數組並輸出
intmain()
{
int**p;//定義二維指針。
intm,n;//行數和列數。
inti,j;
scanf("%d%d",&m,&n);//輸入行數和列數。
if(m<=0||n<=0)return-1;//行數或列數非法。
p=(int**)malloc(sizeof(int*)*m);//申請一組一維指針空間。
for(i=0;i<m;i++)
p[i]=(int*)malloc(sizeof(int)*n);//對於每個一維指針,申請一行數據的空間。
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&p[i][j]);//輸入第i行第j列的數據。其中&p[i][j]也可以寫作p[i]+j或者是*(p+i)+j.功能相同。
printf("輸入的數組為%d行%d列: ",m,n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)//這個循環可以輸出一行元素。
printf("%d",p[i][j]);//輸出i行j列的元素。
printf(" ");//每行輸入結束加換行符。
}
//釋放內存
for(i=0;i<m;i++)
free(p[i]);
free(p);
return0;
}
(7)c語言二維數組動態擴展閱讀
c語言中通過函數傳遞二維數組
#include
void func(int n, int a[][size])
{
/* access array */
a[i][j];
}
void main()
{
int a[10][10];
func(10, a);
}
『捌』 C語言-二維數組動態分配
pArray2=(int**)malloc(sizeof(int*[3])); //分配了3個int*的空間,32地址環境下指針的長度都是32位的也就是4位元組,那3個int*就是12位元組,和3個int長度是一樣的,湊巧而已
也可以寫成這樣:
pArray2=(int**)malloc(3*sizeof(int*)); //分配3個int*的空間
現在pArray2指向的有效空間內包含3個指針,這3個指針是int*,也就是指向int的指針,這3個指針的值是隨機的,還不能用,先要讓它們指向合適的空間才行
於是就有:
for(....)
*(pArray2+i)=(int*)malloc(sizeof(int[3])); //這就是給pArray2指向的空間內的3個指針校正方向,讓每一個指針指向由3個int整數組成的數組的首地址,這才是最終的數據空間
和pArray2一樣,也可以寫成:
*(pArray2+i)=(int*)malloc(3*sizeof(int)); //3個int
『玖』 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
*/