作者:
kkkmode (kkk)
2014-04-22 23:23:10※ 引述《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