C語言為何不改進陣列?

時間 2021-05-08 17:36:10

1樓:大江

變長陣列怎麼實現的?

要不就是鍊錶封裝~

要不就是先給你開乙個固定大小的記憶體區,不夠了?再給你開乙個固定大小的,把原來的拷貝過去~

語言是底層硬體的模擬~

還有,陣列這種東西壓根就是以訛傳訛,所謂的陣列void a[10]的真正含義,其實指的是從位址a往上查10個void型別長度的記憶體單元

所謂的陣列只是好聽而已~

2樓:朱小霖

有限元程式貌似應該是直接賦出來乙個超級大的陣列然後把資料都放在裡面做.....這樣的話速度會快.....至少fortran能應該這麼做....

前面什麼說鍊錶的,是不是都不知道有限元是什麼。。。

3樓:hao sun

首先,C是給了你充分的自由來自己定義你想要的工具,這裡就向題主推薦乙個可能可以滿足你的需求的工具:

你可以寫乙個structure。 裡邊包括乙個heap上的array,乙個int size,乙個int capacity,每次在宣告這個structure的時候對比輸入進來的想要的array 大小和你當前的或者預設的array大小,或者每次往裡push單位的時候對比capacity和size+1 的大小,如果capacity不夠用了或者拿走資料的時候的時候覺得這個array太大了,就複製其中的值並realloc這個array,同時改變你size 和capacity的值。這樣你就包裝好乙個可以自動變化大小的dynamic array了。

大小的變化幅度可以根據你自己的需求來調整

4樓:Belleve

C 是高階彙編

int a[100];

實際上就真的「相當於」

int a0, a1, ..., a99;

想要動態陣列可以用 malloc/realloc 自己實現。

5樓:hahaha2018

樓主是半吊子的學習者,c語言對於動態陣列支援的很好,指標+malloc就很方便的解決。有人提到矩陣傳遞引數的問題,這算問題嗎?c語言值傳遞可以遮蔽引數,避免修改,指標傳遞需要修改的引數,多方便啊。

6樓:薛非

用C編寫有限元程式,我猜題主面臨的乙個主要技術難點應該是向函式傳遞矩陣的問題。

毋庸諱言,原始的C語言在這一點上確實非常蹩腳,但解決問題的辦法還是有的,只是需要對C語言有很深的了解並需要採用一些不常用到的語言技巧。

C99之後這個問題已經很好地解決了。FORTRAN語言的那些演算法基本可以直接搬過去就能用——這正是C99要達到的目的之一。

所以現代C語言已經不存在題主所說的那種「硬傷」了。當然,如果題主不懂得現代的、新的C語言那就是另一回事了。

7樓:

C語言的陣列,本身是指標的變形,表示每次到基址的某個偏移量去取值。

所以在C語言裡,負下標和陣列越界都能編譯通過。題主會不會因此而發狂?

int a = -1;

int b[2];

int c =-2 ;

printf("%d",b[-1]); // 輸出?

8樓:baba tom

請使用動態分配或鍊錶,要不你就使用C++的模板.

指定大小直接宣告陣列在實際工作中比較少用,要不就是偷懶.

一般臨時使用一下,不要太大,超出堆疊就崩了.

現在的機器記憶體是比較大,但是也會用完的啊.虛擬記憶體好使,但不停的交換也是很慢的.

使用演算法,不要去埋怨語言或系統.

9樓:Weijia

問這個問題之前,先問一下自己,這裡邊有兩個變數,乙個是初始化陣列,另外乙個增量,你覺得,初始化陣列設多大合適,另外乙個增量,設計多大合適,如果兩個答案都沒有完美的答案的話,c語言就是幹這個事情的,另外乙個增量在很多時候,還不是乙個常量,還會變化,這個又複雜了

10樓:

事實上,C語言根本沒有什麼陣列,它只是規定了乙個下標訪問資料的語法而已,然後人們以訛傳訛的說這就是陣列。

你要高階陣列自己寫個就好了,更別說一堆的人幫你寫了各種高階的陣列。

11樓:Milo Yip

此問題與「學習組合語言有什麼好處? 」問題有點關係。C/C++語言的設計和低層的設計有關,作為自動變數的陣列對應棧的記憶體分配,而作為靜態/全域性變數的陣列是在鏈結時預先分配的,所以不可以實現為自動增長。

其他答案中提到的動態分配棧上空間,C99有variable length array,但在不同架構下未必能實現棧上動態分配,有可能會實現為堆上分配。而在C/C++中也可使用(非標準的)alloca()函式去實現。

12樓:BHEscaper

首先提一嘴:

如果你是想要用乙個變數來作為陣列宣告時的大小,C99就已經早已實現了。

array[size];

完全沒有問題,不過陣列的大小並不會隨著size變化而變化。

然後:你知道那些可以任意調節大小的陣列是怎麼實現的嗎?

其實非常簡單:

1.先把資料存在乙個固定大小的陣列裡。

2.地方不夠了,就再開乙個更大的固定陣列,然後把資料複製進去。

好了,現在你還對這些看起來比較聰明的陣列感興趣嗎?

13樓:Kenneth

同學,這是乙個堆和棧上記憶體分配不同方式的問題,現在以你的了解程度很難跟你解釋。你先帶著這個疑問學下去吧,慢慢你就明白自己的這個問題有多小白了。

14樓:鍾宇騰

誰說C/C++的陣列一定要指定大小的

int*

array1=(

int*

)calloc(n

,sizeof

(int

));// C

int*

array2

=new

int[n];

// C++

其中n就是執行時指定的大小。其它語言裡面的可變長度陣列也是這麼實現的。

為何要改進?固定大小的陣列有時非常有用呢!

c語言如何不用陣列把數字倒過來?

NoneType unsigned long long reverse unsigned long long Val return Res 雪地裡的枯樹 使用指標,如int a 2 int p a for int i 1 i 0 i 這樣就可以實現對數字的反向輸出。 輸入a,輸出a的各位數字反轉的結...

C 為何不允許在函式中直接傳遞陣列?

張金戈 很簡單呀,陣列是乙個位址加一段記憶體空間。非陣列string要麼在開頭儲存長度,要麼在結尾用 0結束。陣列本身並沒有這些資訊,所以要額外傳長度 DNFL 關於這個,我說個c語言的例子,對於c 我不太了解。我認為在宣告乙個陣列時,其識別符號有其作用域,那就是乙個函式內。我試過把陣列放到結構體裡...

C語言中多維陣列是否慢於一維陣列?

土地測量員 對於在全域性或者棧上分配的多維陣列 也就是位址是連續的 都可以看成是一維陣列模擬出來的,要訪問某個元素肯定存在著計算偏移量的過程,不過是交給編譯器幫你來完成這個過程了 其實可以看成語法糖的樣子?所以它比起一維是要慢一點。不過很多時候,某些東西從邏輯上來講就是多維的,你用一維的思路無法解決...