C语言 数组传递与值传递讲解
在普通變量或下標(biāo)變量作函數(shù)參數(shù)時(shí),形參變量和實(shí)參變量是由編譯系統(tǒng)分配的兩個(gè)不同的內(nèi)存單元。在函數(shù)調(diào)用時(shí)發(fā)生的值傳送是把實(shí)參變量的值賦予形參變量。在用數(shù)組名作函數(shù)參數(shù)時(shí),不是進(jìn)行值的傳送,即不是把實(shí)參數(shù)組的每一個(gè)元素的值都賦予形參數(shù)組的各個(gè)元素。因?yàn)閷?shí)際上形參數(shù)組并不存在,編譯系統(tǒng)不為形參數(shù)組分配內(nèi)存。那么,數(shù)據(jù)的傳送是如何實(shí)現(xiàn)的呢?在我們曾介紹過,數(shù)組名就是數(shù)組的首地址。因此在數(shù)組名作函數(shù)參數(shù)時(shí)所進(jìn)行的傳送只是地址的傳送,也就是說把實(shí)參數(shù)組的首地址賦予形參數(shù)組名。形參數(shù)組名取得該首地址之后,也就等于有了實(shí)在的數(shù)組。實(shí)際上是形參數(shù)組和實(shí)參數(shù)組為同一數(shù)組,共同擁有一段內(nèi)存空間。因此當(dāng)形參數(shù)組發(fā)生變化時(shí),實(shí)參數(shù)組也隨之變化。
上圖說明了這種情形。圖中設(shè)a為實(shí)參數(shù)組,類型為整型。a占有以2000為首地址的一塊內(nèi)存區(qū)。b為形參數(shù)組名。當(dāng)發(fā)生函數(shù)調(diào)用時(shí),進(jìn)行地址傳送,把實(shí)參數(shù)組a的首地址傳送給形參數(shù)組名b,于是b也取得該地址2000。于是a,b兩數(shù)組共同占有以2000為首地址的一段連續(xù)內(nèi)存單元。從圖中還可以看出a和b下標(biāo)相同的元素實(shí)際上也占相同的兩個(gè)內(nèi)存單元(整型數(shù)組每個(gè)元素占二字節(jié))。例如a[0]和b[0]都占用2000和2001單元,當(dāng)然a[0]等于b[0]。類推則有a[i]等于b[i]。
多維數(shù)組也可以作為函數(shù)的參數(shù)。在函數(shù)定義時(shí)對形參數(shù)組可以指定每一維的長度,也可省去第一維的長度。因此,以下寫法都是合法的:
int MA(int a[3][10]);或int MA(int a[][10]);
下面給出兩個(gè)將數(shù)組傳遞進(jìn)函數(shù)的例子:
ex1:
ex2:
//將數(shù)組中小于0的元素置成0 #include <stdio.h> void nzp(int a[8]) {int i;printf("\nvalues of array are:\n");for(i=0;i<8;i++){if(a[i]<0)a[i]=0;printf("%d ",a[i]);} }int main(void) {int b[5],i;printf("\ninput 5 numbers:\n");for(i=0;i<5;i++)scanf("%d",&b[i]);printf("initial values of array b are:\n");for(i=0;i<5;i++)printf("%d ",b[i]);nzp(b); //將有5個(gè)元素的數(shù)組傳遞進(jìn)一個(gè)有8個(gè)元素的數(shù)組的函數(shù),編譯通過printf("\nlast values of array b are:\n");for(i=0;i<5;i++)printf("%d ",b[i]);return 0; } 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的C语言 数组传递与值传递讲解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构-图的深度优先遍历(DFS)和广
- 下一篇: Java 学习网站,好不好自己看就完事了