看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《wvwvwvwvwv (殺死丁力這個雜碎a~)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : Visual C++ 2008 : 問題(Question): : 把轉換大小寫的程式碼寫在主程式可以成功執行 : 一旦用了函式 就會失敗 : 餵入的資料(Input): : A B C 1 2 3 d e f : 預期的正確結果(Expected Output): : abcDEF : 錯誤結果(Wrong Output): : 程式碼(Code):(請善用置底文網頁, 記得排版) : http://codepad.org/b0ELpY3D ←全寫在主程式 : http://codepad.org/4r99xVBa ←用函式寫 錯誤的 : 補充說明(Supplement): : 有爬過至底13誡 是否是因為第4點的關係? 看過你的程式 你有一定基礎,處於撞牆期 衝破後功力就是你的 1.首先,先看一下你的程式 &a和a都代表陣列起始位置,對於陣列加不加&都一樣 把陣列當作參數傳遞,是傳陣列的起始位置而非傳整個陣列 此時函式的形參可以宣告成陣列或指標,實參也可以傳入陣列或指標 在其他情況下指標不等於陣列 2.假如你堅持不改函式宣告,那程式要做以下修正: i. main(void)加上: char *pa=a; csie(&a,j)改成csie(&pa,j); ii. csie(char *p[],int x)加上: char *s=*p; //形參*s[]改成*p[] 由於陣列在函式的形參會被轉成指標,所以以下宣告也成立 csie(char **p,int x) 3.解釋一下為何其他情況指標不等於陣列,先寫以下3個檔案編譯: **********v.h********** #ifndef V_H_INCLUDED #define V_H_INCLUDED int i[]; #endif **********v.c********** #include "v.h" int i[3]={1,2,3}; **********main.c********** #include <stdio.h> #include <stdlib.h> int main() { extern int *i; printf("i[1]=%d\n",i[1]); return 0; } *************************** 以上程式在執行時會fail,要把v.c改成如下才可順利執行: int i[3]={i,2,3}; //1改成i 原因是陣列取下標運算,是直接從陣列起始位置+下標值*型別size得到記憶體位置 再去此記憶體位置取值,只有一次memory access 而指標取下標,會把指標存的的值取出來,再加上下標值*型別size得到記憶體位置 再去此記憶體位置取值,兩次memory access 這個例子是用來證明在一般宣告時陣列不等於指標 只有把陣列傳入函式時,函式的形參可以宣告成陣列或指標 建議你可以看Expert C Programming(譯名: C專家編程) 這本是1994年出的,但還是蠻有參考價值,可以去簡體書店找看看 另外,建議練習C語言不要用visual studio 因為visual studio只支援C89,C99沒有完整支援 目前最新標準是C11 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.25.246.151 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1398180192.A.E14.html ※ 編輯: kkkmode (114.25.246.151), 04/22/2014 23:26:13
wvwvwvwvwv:謝謝 04/24 02:17