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&然而你這個完全可以用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編程語言 |