1、因?yàn)閿?shù)組在內(nèi)存中是一塊連續(xù)的內(nèi)存,只要將該數(shù)組的首地址傳進(jìn)去,當(dāng)然就可以訪問整個(gè)數(shù)組了。值得注意的是,由于只傳了首地址,函數(shù)不知道數(shù)組的維數(shù),所以還得把數(shù)組的維數(shù)傳進(jìn)去,那就可以完全操作該數(shù)組了。

站在用戶的角度思考問題,與客戶深入溝通,找到玉環(huán)網(wǎng)站設(shè)計(jì)與玉環(huán)網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國際域名空間、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋玉環(huán)地區(qū)。
2、例:有一個(gè)函數(shù)聲明:void fun( int aa[],int size );或者void fun( int *pa,int size );
以上兩種聲明都一樣。
調(diào)用上訴函數(shù)時(shí):假設(shè)有 int ab[10];
fun( ab,10 )就可以了。
數(shù)組參數(shù)屬于指針參數(shù).
指針參數(shù)即時(shí)傳址參數(shù)(或叫引用參數(shù)), 如果想在函數(shù)中修改參數(shù)的值, 這是唯一的途徑.
如果把數(shù)組當(dāng)作參數(shù), 不管你愿意與否, 它就是指針, 指向第一個(gè)值的指針.
1. 數(shù)組參數(shù)就是指向第一個(gè)元素的指針: #include stdio.h
void getArr(int p[], int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
getArr(ns, sizeof(ns)/sizeof(ns[0]));
getchar();
return 0;
}
void getArr(int p[], int si) {
int i;
for (i = 0; i si; i++) {
printf("%d\n", p[i]);
}
}
2. 干脆直接聲明為指針: #include stdio.h
void getArr(int *p, int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
getArr(ns, sizeof(ns)/sizeof(ns[0]));
getchar();
return 0;
}
void getArr(int *p, int si) {
int i;
for (i = 0; i si; i++) {
printf("%d\n", p[i]);
}
}
3. 即使你在形參中指定維數(shù)也不起作用: #include stdio.h
void getArr(int p[2], int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
getArr(ns, sizeof(ns)/sizeof(ns[0]));
getchar();
return 0;
}
void getArr(int p[2], int si) {
int i;
for (i = 0; i si; i++) {
printf("%d\n", p[i]);
}
}
4. 既然是指針, 其值就有被修改的可能: #include stdio.h
void getArr(int p[], int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
size_t i;
getArr(ns, sizeof(ns)/sizeof(ns[0]));
for (i = 0; i sizeof(ns)/sizeof(ns[0]); i++) {
printf("%d\n", *(ns+i));
}
getchar();
return 0;
}
void getArr(int p[], int si) {
int i;
for (i = 0; i si; i++) {
p[i]++;
}
}
5. 如果是字符數(shù)組, 它自己能判斷數(shù)組尾界: #include stdio.h
void getArr(char p[]);
int main(void)
{
char ns[] = "ABCDEFG";
getArr(ns);
getchar();
return 0;
}
void getArr(char p[]) {
int i;
for (i = 0; p[i]; i++) {
printf("%c: %d\n", p[i], p[i]);
}
}
舉個(gè)栗子,比如計(jì)算a+b的值的函數(shù)
#includestdio.h
int?plus(int?a,int?b)
{
int?c?=?a+b;//2.此處定義的c無法被主函數(shù)直接調(diào)用,因?yàn)閏為局部變量
return?c;//3.要返回計(jì)算結(jié)果,只能用return語句
}
int?main()
{
int?i=5,j=7;
int?ans?=?plus(i,j);//1.該過程中,首先將i,j作為參數(shù)(與上面的plus函數(shù)說明(m,n)一一對應(yīng))傳遞給plus函數(shù)。
printf("%d",ans);
}
p函數(shù)就是個(gè)冒泡遞減排序功能。標(biāo)準(zhǔn)函數(shù)頭寫法應(yīng)該是void p(int a[])而不是void p(int a[5]),即使寫成void p(int a[5]),編譯器也是按void p(int a[])解釋而不按void p(int a[5])解釋,而且這里a[]的意思就是定義a是int *型指針。函數(shù)p中并沒有改變a,改變的是a指向的目標(biāo)a[0]~a[4]。所以不知你問的具體是啥意思……
看你的代碼。
你問題并不在數(shù)組傳入。你函數(shù)mymd5接收password數(shù)組,mymd5的password數(shù)組變量和外部函數(shù)的password地址相同,所以改變其中外部函數(shù)的數(shù)組也改變。
但你mymd5返回的數(shù)組decrypt,是局部變量,當(dāng)mymd5調(diào)用結(jié)束,這個(gè)數(shù)組的內(nèi)存空間就釋放了。你接收了也是NULL。所以要用malloc或calloc申請動態(tài)內(nèi)存。這樣不會被釋放。
我寫了簡單案例,你參考:
#includestdio.h
#includemalloc.h
#includestring.h
char?*md(char?a[]);//錯(cuò)誤的數(shù)組返回
char?*md2(char?a[]);//正確的數(shù)組返回
int?main()
{
char?password[10]="123456789",*decrypt=NULL;
decrypt=md(password);
printf("外部函數(shù)傳遞數(shù)組到子函數(shù),子函數(shù)改變,外部函數(shù)也改變,password=%s\n",password);
printf("錯(cuò)誤返回方式:局部變量,外部函數(shù)接收失敗,被自動釋放,decrypt=%s\n",decrypt);
decrypt=md2(password);
printf("正確返回方式:動態(tài)申請,外部函數(shù)接收成功,不會被自動釋放,decrypt=%s\n",decrypt);
return?0;
}
char?*md(char?password[])
{
char?decrypt[10]="*********";
password[0]=0,strcpy(password,"abcdefghi");
return?decrypt;
}
char?*md2(char?password[])
{
char?*decrypt=(char?*)malloc(sizeof(char)*10);
if(!decrypt)
return?NULL;
strcpy(decrypt,"*********");
password[0]=0,strcpy(password,"abcdefghi");
return?decrypt;
}
當(dāng)前標(biāo)題:c語言自定義函數(shù)傳數(shù),c語言自定義函數(shù)調(diào)用自定義函數(shù)
URL標(biāo)題:http://chinadenli.net/article31/dseijpd.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、網(wǎng)站設(shè)計(jì)、域名注冊、面包屑導(dǎo)航、外貿(mào)網(wǎng)站建設(shè)、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)