標籤:

c語言是否可以通過調用void函數來完成對數組的賦值?

如圖主函數中定義了一個2*2數組average_delay,想通過調用函數zeros_matrice來完成對average_delay的賦值,這種做法是否可行?

ps. 平時科研中主要是用Matlab驗證演算法和策略,不太會c語言。近期找同行要到的代碼是用c寫的,其中大部分函數的用法都是:將實參傳入void函數,利用函數中的運算來更新實參的值,但是這與我理解的c語言中函數的用法不一樣。按我的理解,調用函數時不管函數內部做了什麼運算,都不應該會影響主函數中的變數。想請教各位c語言大神,圖中的代碼功能能實現嗎?

---------------------------------

衷心感謝各位大神的回答,讓題主了解了一些基本概念。之前的提問中主要困惑源於不知道有C99,並且用visual c++來運行,所以報錯。需要解釋的一點是:zeros_matrices函數申明原本是有的,為了方便才複製過來,反而誤導了各位答主,不好意思。現題主已安裝code::blocks和MinGw,於是程序能夠順利運行,題主的問題解決了。

再次感謝各位答主!!


P.S. 下面有個答案說變數可以當數組長度,這沒問題,但是題主明顯用的是Visual C++,只支持最新的C++,不支持最新的C語言,所以沒戲。在Windows下編程,就忘記世界上有C語言這麼一回事(逃

這是語法錯誤,你需要寫的是:

template&
void zero_matrice(double(xss)[U][V])
{
for (auto xs : xss) for (auto x : xs)
x = 0;
}

double average_delay[2][2];
zero_matrice(average_delay);

但是具體到你的情況:

double average_delay[2][2] = {0}; // 只對0有效


double* z不完了么

void zeros(int width, int height, double* buf) {

long length = width * height;

for(long i=0;i&return;

}

然而你這個完全可以用memset吧

然後matlab的參數不可變的機制是copy on write,當函數內沒有修改參數時是引用傳遞,函數內修改了參數就會變成值傳遞,而C是可以自由選擇引用傳遞還是值傳遞的。


變長數組啊,c99範疇,vc沒戲,並且數組在函數參數會退化為指針

如果數組參數退化成指針,則不知道步長,不行,可以強行傳入步長來搞定

如果只是想初始化為0的話,直接={0},不必如此麻煩


謝邀。圖上的不可行,因為沒有在調用前聲明函數


必須要引用或者傳入指針,你這樣是不行的

還有你聲明的數組後面的下標不能是變數,除非你自己申請


看圖IDE貌似不支持C99,那個紅色的波浪線…

題主問的是是否可以用這個函數對傳入的參數進行修改,但是由於這個程序有一些問題:

1.譬如沒有聲明下面那個函數,導致編譯器可能不認識 main() 中引用的 zeros …那個函數,可能運行不了。

2. 再譬如 C 語言到了 C99 這一版之後才支持變數作為數組長度,但是 IDE 的支持程度不一,可能運行不了。

於是大家好像忽視了題主想要了解的問題,我冒昧地回答一下:是可以的,這和 void 沒有關係,跟函數是否返回值,返回什麼類型的值沒有關係。

關鍵在於參數究竟是某個具體值還是指向待修改值的地址,可以通過傳遞指向待修改值的地址,比如指針,或者程序中,數組名(數組第一個元素的地址)這樣的方式來訪問並操作存儲在該地址中的值,以達到修改數組的目的。

但是你同樣無法修改傳入的地址這個值,除非你傳入的是指向地址的地址,也就是指針的指針(??;昏了嗎?(??????) ?詳見各種 C 語言資料中講指針的部分,特別是指針與函數參數,指針與數組部分。

順便問一句,你的 C 語言課本莫不是譚浩強("?ω?") ,如果是,還是換一本吧…


「按我的理解,調用函數時不管函數內部做了什麼運算,都不應該會影響主函數中的變數。」

確實,函數對形參的修改不會影響到實參,但是函數可以通過指針的形式間接修改函數外的變數值。

簡單地說,在定義zeros_matrice函數的時候,乍一看參數列表中寫的是double類型的二維數組,但事實上,傳入函數的是某數組(此例中為average_delay)的首元素地址,是一個指針,而非整個數組。

初學者可以簡單理解為,函數對傳入的數組的修改是會影響到函數外實參數組的。

建議題主去看看C語言數組、指針、函數形參實參、作用域相關知識。


memset(array, 0, sizeof(double) * x * y)


void zero_matrix(int x, int y, double (*p)[2]) {
for (int i = 0; i &< x; i++) { for (int j = 0; j &< y; j++) { *(p[i]+j) = 0; } } }

函數改成這樣;調用改成這樣(不置前就要聲明哦):

zero_matrix(2,2,average[0]);

《Learn C++ in 24 hours》。。。。。。

程序寫的撇,匿。


感覺就是對方用C99風格寫了個程序,題主拿過來很疑惑吧_(:з」∠)_

課本上的例題也是這樣寫的_(:з」∠)_,但有一些坑人的地方,建議使用C艹的更高級的功能。

下面是原答案:

這是正確的語法,將二維數組和它的兩個長度同時同時傳給函數,讓函數來操控這個數組。

提示1:長度寫在數組前面,比如:

void fun(int x, int y, int z, int array[x][y][z]);

提示2:數組長度可以用常數、常量、變數來聲明。再說一遍,可以用變數聲明數組長度。

提示3:C語言中,const也是變數的一種,或者說「常變數」,用const變數定義數組長度時,要和用普通變數時一樣,不能給數組初始化。


推薦閱讀:

C編譯器用什麼語言寫的?
這個指針C語言如何聲明?
不用QT,你能讓UI同時運行在Mac, IOS, Windows, Android, Linux上嗎?
如何用C/C++動手編程一款windows平台下的屬於自己的音樂播放器軟體?
c++中cin和scanf的區別是什麼?

TAG:C編程語言 |