我真是太菜了,本來我是今天打算好好搞搞dynamic_programming一系列的經典問題,結果只是停留在把陣列連乘的原理給看懂了而已。
原因嘛:
1.當我想要動手實現時,為了給函式和變數起個專業點兒的名字,特意去看了一些細節的命名規範問題;
2.呦西,命名規範解決了,但是名字怎麼取才能看起來逼格高一些呢,不是說好的**不需要注釋,只看命名就行了麼。然後我發現我想表達的變數名字對應的單詞我不會,於是我又去查單詞了;
3.呦西+1,命名總算搞定了,但是這個參考**裡面,傳遞引數為什麼用vector,上次用vector,這次我換到陣列吧。然後,我又發現陣列傳參的一系列問題我不太熟悉。然後我又開始寫一些小函式測試陣列傳參的那些問題去了;
4.現在,**沒實現,oj也沒刷,那就把陣列傳參問題先寫下來吧......
有兩種傳遞方法,一種是function(int a); 另一種是function(int *a)
這兩種兩種方法在函式中對陣列引數的修改都會影響到實參本身的值!
對於第一種,根據之前所學,形參是實參的乙份拷貝,是區域性變數。但是陣列是個例外,因為陣列的資料太多了,將其一一賦值既麻煩又浪費空間,所以陣列作為引數傳遞給函式的只是陣列首元素的位址,資料還是在記憶體裡的,函式在需要用到後面元素時再按照這個位址和陣列下標去記憶體查詢。也就是說後面的元素根本沒到函式裡來。所以,這裡也不能在test()函式內部用sizeof求陣列的大小,必須在外面算好了再傳進來。
對於第二種,則是傳址呼叫,無需再說。
這裡還有幾點需要注意:
1.在以上兩個函式的形參前面加上const則表示整個陣列唯讀,而不是只有首位址對應儲存的資料唯讀。
2.第二種形式不能用c++11中的for...auto來迴圈列印。
3.陣列的大小要用sizeof()來求,不能用.size(),因為.size()只有struct 或者union才能用, vector算是struct!
4.如果在函式內部又宣告乙個int* tmp型別的變數,然後把p賦值給tmp, 通過tmp修改數陣列也是一樣,都會修改實參本身!
測試**如下:
#include #include using namespace std;void test1(int, int size);
void test2(int *p, int size);
//void test2(const int *p, int size);
int main(void)
; int size = sizeof(a)/sizeof(int);
/*這裡列印出的a值與test1(),test2()中的p值相等
*即位址值相同*/
printf("%p \n", a);
//test1(a, size);
test2(a, size);
int i;
printf("main: ");
for(i = 0; i < size; ++i)
} void test1(int p, int size)
printf("\n");
}void test2(int *p, int size)
printf("\n");
}
總結:自己這基礎知識真是捉急啊!英語也是糟糕透頂!平時多敲敲**吧!多看看英文版書籍吧!! 而不是抄**!!要原創原創!!
丫的懂否?! 少吃零食多coding才是真理啊!
C C 中函式引數傳遞
c或c 中函式的引數傳遞包括 值傳遞 指標傳遞 引用傳遞這三種方法。以經典的交換兩個整數為例 問題描述 輸入描述 兩個待交換的整數。程式輸出 交換後的兩個整數。includevoid myswap int x,int y int main include 指標傳遞,函式體內只有指標值的變化 void...
c c 中函式的引數傳遞
c c 中,函式可以傳遞的引數有三種形式,值 引用和指標。下面來看一段 看看三種傳遞方式產生的結果。include include using namespace std void change1 int n void change2 int n void change3 int n int mai...
C C 語言陣列作為引數傳遞
include include include define line 2 define row 4 int array char szstr row int len return 0 int main char szstr 4 寫乙個指標,將陣列中的元素賦值給它 int i for i 0 i 4...