因為要使用較多的矩陣,為簡單省事,于是撰寫下邊的函式,其中show函式是為了驗證我其余兩個函式是否正確,,然而,我的嘗試失敗了,原因未知,求解答,謝謝!
我打的原始代碼如下
#include<stdio.h>
#include<stdlib.h>
int **a;
void creat(int**a,int m,int n);
void fre(int**a,int m,int n);
void show(int**a,int m,int n);
int main (){
int m,n;
scanf("%d%d",&m,&n);
creat(a,m,n);
show(a,m,n);
fre(a,m,n);
return 0;
}
void creat(int**a,int m,int n){
int i;
a=(int**)malloc(m*sizeof(int*));
for(i=0;i<m;i++)
a[i]=(int*)malloc(n*sizeof(int));
}
void fre(int**a,int m,int n){
int i;
for(i=0;i<n;i++)
free(a[i]);
free(a);
}
void show(int**a,int m,int n){
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d", a[i]+j);
for(i=0;i<m;i++)
for(j=0;j<n;j++){
printf("%d",a[i][j]);
if(j<n-1)
printf(" ");
else
printf("\n");
}
}
uj5u.com熱心網友回復:
沒搞清形參,實參要使實參生效,再加一重指標,呼叫時傳入a的地址
uj5u.com熱心網友回復:
謝邀,不要把記憶體想得那么復雜,你申請一塊記憶體,那就是一個連續的空間
【至少從行程或者程式員的視角,他是連續的,(可能在物理上并不一定連續,但是沒關系,這種轉換,作業系統會幫你完成)】。
沒錯,一長串連續的東西。
只是你怎么操作他是你的事,這是編程中一個繞人的東西。
想象一個4 X 5 = 20cm的繩子,你把它折起來,之字形回折,【每到5cm處折一次】
假設不夠直觀,你在折角處把他剪斷,然后擺平整【但是你要記住,他們再記憶體中還是連續的】
現在他是一個4 X 5的矩陣了
本來嘛,這樣就搞定了
int *p = (int *)malloc(sizeof (int ) * 20);
for(int i = 0; i < 4; i++){
for(int j = 0; j < 5; j++){
*p++ = i*5 +j;
}
}
但是你非有強迫癥,想用二維陣列,
告訴你,沒有這樣的操作,除非你手動像編譯器一樣去構造這樣的東西
二維陣列 int a[4][5];
實際上是什么樣的東西呢?
你不要以為他是簡單的二重指標 int **p = a;
這樣你就大錯特錯了,二重指標不是這樣設計來操作二維陣列的,相信我從今天開始放棄這個想法。
二維陣列,用指標來表達是什么樣的東西呢,是陣列指標。 int (*p)[5]; 這不是新手能看懂的東西。
他是一個指標,,指向一個陣列型別,
===注意
在C89標準下:
而且這個陣列型別的大小必須指定, 比如int (*p)[5]; 這個5必須指定
你不能定義這樣的指標 int (*p)[]; 又或者是int (*p)[n]; //n是運行時指定的
因為對編譯器來說,你代碼這樣寫 p++, 他必須知道地址得往后跳多少個位元組,
對于int (*p)[5] 來說,p++ , 就是p往后跳5個整數,
===
~~~
【平時看到的指標是指向int, char 這些基本型別】,不是像你所想像的一維陣列里面放N個指標。
,如果你對a[i][j]這種風味的東西總是念念不忘,
很抱歉C89標準不支持動態的二維陣列,辦不到。
C99可以支持動態陣列,編譯的時候加上--std=c99,
如果你的編譯器不支持c99,又或者你用vc之類的,而你又不知道怎么開啟c99編譯選項,請忘了他吧。不要做這種嘗試。
事情沒你想的那么復雜,不要過度想象。。。要理解本質。
以下代碼在C99編譯器下可以運行,【大部分代碼直接拷貝你的,然后做修改,按你的意圖去實作,你可以體會一下】
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <stdio.h>
#include <stdlib.h>
void creat(void **a, int m, int n);
void fre(void *a);
void show(int m, int n, int (*a)[n]);
int main()
{
int m, n;
scanf("%d%d", &m, &n);
/*你能想象為什么malloc出來的指標都是void型別的,
都是程式員人為的給他強制轉換, 隨意揉捏
你認為他是圓的他就是圓的,你認為他是扁的他就是扁的
但是,實質上,他是一條線,就是一段連續的記憶體,------------------------這樣*/
int (*a)[n];
creat((void**)&a, m, n);
show(m, n, a);
fre((void*)a);
return 0;
}
/**/
void creat(void **p, int m, int n) //
{
*p = malloc(sizeof(int) * m * n);//
}
void fre(void *a)
{
free(a);//想清楚,為什么這里free的時候不用二重指標,
//回憶一下剛才怎么申請記憶體的,一次free對應一次malloc
}
void show(int m, int n, int (*a)[n])
{
int i, j;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
scanf("%d", a[i] + j);
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
{
printf("%d", a[i][j]);
if (j < n - 1)
printf(" ");
else
printf("\n");
}
}
程式執行結果

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/76000.html
標籤:C語言
上一篇:求助:本人急需Cppan windows client
下一篇:關于程式插件機制的困惑
