很早以前,還是學c語言的時候,,當我把,資料類型,常量變數,語句控制,函數,指標,結構體,自訂資料類型,還有一些簡單人遞迴,研究完的時候,本以為c語言學的能及格了..那天看到一本c語言的書.令我不敢相信,將近1000頁的書..感到很是驚異,那麼厚的書只有在c++,java這樣庫比較多的語言的書中才能看到..
最後得出結論,我的c語言還沒及格,,,
偶然遇到一個c語言傳遞二維數組的問題..以前學的時候沒有想到...試著做了一個...並不是自己想的那樣手到擒來的..
我開始寫的是這樣的:
#include<iostream>
using namespace std;
typedef vector<int> cn;
void show(int n1, int n2 ,int *p[])
{
for(int i=0;i<n1;i++)
{
for(int j=0;j<n2;j++)
{
p[i][j]++;
cout<<p[i][j]<<" ";
}
cout<<endl;
}
}
int main()
{
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
show(3,3,a);
return 0;
}
結果並不是我想的那樣:提示出這樣的錯誤...
不能將 int (*)[]類型,賦值給,int **....
這讓我感到很奇怪.這兩個不是同一類形嗎.//
編譯器是肯定不會出錯的..那隻能是我自己的問題.
我馬上意識到,二維數組的名子,並不是一個單純的二級指標...
後來我試著這樣做,,,int **p=a;
一樣的錯誤,,,證明我的想法是正確的..
下面是我改正的程式:
#include<iostream>
#include<vector>
using namespace std;
typedef vector<int> cn;
void show(int n1, int n2 ,int **p)
{
for(int i=0;i<n1;i++)
{
for(int j=0;j<n2;j++)
{
p[i][j]++;
cout<<p[i][j]<<" ";
}
cout<<endl;
}
}
int main()
{
int **a;
a=new int *[3];
for(int k=0;k<3;k++)
a[k] = new int[4];
for(int i = 0;i<3;i++)
for(int j=0;j<4;j++)
a[i][j]=3;
for(int i = 0;i<3;i++)
{
for(int j=0;j<4;j++)
cout<<a[i][j];
cout<<endl;
}
show(3,3,a);
return 0;
}
把數組改成動態申請的,,,問題解決....
這說明什麼呢.:
直接申請,和動態審請的數組,記憶體空間的結構是不一樣的...
對於直接申請的數組,並不能用二級指標,找到它所有的元素的儲存地址...
至於它的空間是直接連續申請的..
這可能也是一些編譯器禁止傳遞二維數組吧...它是c語言(c++)開始設計二維數組的缺憾吧...
所以,在c++程式設計中,要避免這樣做...可以用vector等很多,好的資料結構,去代替它....