C语言中函数调用中的传值与传址
首先介紹一下函數中傳值與傳址的概念:
下來用兩個例子來說明:
先看看這個代碼
#include<stdio.h>void swap(int n1,int n2) {int temp;temp=n1;n1=n2;n2=temp; }int main() {int a=10;int b=20;printf("a=%d\n",a);printf("b=%d\n",b);swap(a,b);printf("a=%d\n",a);printf("b=%d\n",b); }以上代碼實現的功能好像是交換兩個數的數值對吧!運行一下看看結果:
不對啊,和我們預想的不一樣啊,可以看到a,b的值并沒有被交換,怎么回事呢?
因為a和b雖然成功把值傳給了n1、n2,n1、n2也完成了它們之間數值的交換,但是也僅僅是n1、n2之間交換了,和a、b沒有關系。這是一次單向的傳遞過程,a、b能傳給n1、n2,n1、n2能成功互換其數值,但n1、n2是定義在函數swap中的局部變量,當函數調用結束后,它倆就over了,被殘忍拋棄了(子函數的生命期為子函數開始調用到結束調用,調用結束后就主動釋放了),因此它們沒有渠道把交換的值傳回給a、b。所以看到的是如上圖的結果。
有了以上的結果,我們再來看這樣一段代碼:
#include<stdio.h>void swap(int *p1,int *p2) {int temp;temp=*p1;*p1=*p2;*p2=temp; }int main() {int a=10;int b=20;printf("交換前a,b的值分別為:\n");printf("a=%d\n",a);printf("b=%d\n",b);swap(&a,&b);printf("交換后a,b的值分別為:\n");printf("a=%d\n",a);printf("b=%d\n",b); }以上代碼的功能同樣是實現交換兩個數的數值對吧!讓我們再來看看運行結果:
很奇怪,為什么這兒卻能交換了?調試一下看看有什么玄機:
這是調用swap函數前a、b的數值與其在內存中開辟的空間的地址以及調用函數后時*p1、*p2的數值與其地址。
這是調用swap函數后a、b的數值與其在內存中開辟的空間的地址以及開始調用函數時*p1、*p2的數值與其地址。
可以看到此時a、b與*p、*p2的地址空間是一樣的,那么當*p1、*p2被修改時,a、b也會跟著發生變化,因為此時二者占用了同一塊空間,當任意一者使空間里的內容發生變化時,二者都會做相同變化。
舉個不太恰當的例子,把夫妻二人各看做一個變量,把它們的共用的銀行卡看做它們占用的同一塊空間,此時,他倆擁有的財產是一樣的,都是銀行卡里的錢,那么,不管誰花了或存了錢,他兩的財產都會發生同等改變,任意一人對財產的修改會影響到另一個人的財產。(當然,私房錢不算)。仔細想想,其實大概就是這么個道理。
函數調用的傳值與傳址大概就是這么個過程,這快內容其實不難理解,只要知道其概念,通過實驗驗證,很容易掌握。
總結
以上是生活随笔為你收集整理的C语言中函数调用中的传值与传址的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: svg转css font,css – 如
- 下一篇: html跳转网页为什么网页无法访问,朋友