1. 程式人生 > >C語言 傳地址一定會改變主函式中變數的值嗎?

C語言 傳地址一定會改變主函式中變數的值嗎?



我們都知道在函式呼叫中,引數傳遞的方式有傳值和傳地址之分,如果主函式傳遞給子函式引數時採用傳地址的方式,主函式的變數值一定會變化嗎?請先看下面的程式:

程式1

#include<stdio.h>

void swap(int *x,int *y)

{

int t;

t=*x;

*x=*y;

*y=t;

}

int main(void)

{

int a=10,b=20;

swap(&a,&b);

printf("a=%d,b=%d\n",a,b);

return 0;

}

程式2

#include<stdio.h>

void swap(int *x,int *y)

{

int *t;

t=x;

x=y;

y=t;

}

int main(void)

{

int a=10,b=20;

swap(&a,&b);

printf("a=%d,b=%d\n",a,b);

return 0;

}

以上兩個程式是不是都會改變主函式中a和b兩個變數的值,並輸出a=20,b=10呢?

接下來,分析一下兩個程式:

關於怎麼快速學C/C++,可以加下小編的C/C++學習群:341+636+727,不管你是小白還是大牛,小編我都歡迎,不定期分享乾貨,歡迎初學和進階中的小夥伴。每天晚上20:00都會開直播給大家分享C/C++遊戲程式設計學習知識和路線方法,群裡會不定期更新最新的教程和學習方法,最後祝所有程式設計師都能夠走上人生巔峰,讓程式碼將夢想照進現實

先分析程式1,在交換語句執行前的狀況如圖1所示:

(圖1)

交換的內容是*x和*y,實際交換的內容是變數a和b的值,交換語句執行後的狀況如圖2:

(圖2)

所以,在主程式中輸出的內容是a=20,b=10。

接下來看看程式2,由於傳遞引數的方式與程式1完全一樣,所以交換語句執行前的狀態與程式1中交換語句執行前的狀況一樣,如圖1所示。

但是,程式2中交換的內容是x和y,也就是這兩個變數內所儲存的地址值,所以交換語句執行後的結果如圖3所示:

(圖3)

程式2中變數a和b的值並沒有改變,輸出的結果為a=10,b=20。

所以程式1中變數a和b的值發生了交換,程式2中變數a和b的值沒有交換,你的想法與我的一樣嗎?

我們都知道在函式呼叫中,引數傳遞的方式有傳值和傳地址之分,如果主函式傳遞給子函式引數時採用傳地址的方式,主函式的變數值一定會變化嗎?請先看下面的程式:

程式1

#include<stdio.h>

void swap(int *x,int *y)

{

int t;

t=*x;

*x=*y;

*y=t;

}

int main(void)

{

int a=10,b=20;

swap(&a,&b);

printf("a=%d,b=%d\n",a,b);

return 0;

}

程式2

#include<stdio.h>

void swap(int *x,int *y)

{

int *t;

t=x;

x=y;

y=t;

}

int main(void)

{

int a=10,b=20;

swap(&a,&b);

printf("a=%d,b=%d\n",a,b);

return 0;

}

以上兩個程式是不是都會改變主函式中a和b兩個變數的值,並輸出a=20,b=10呢?

接下來,分析一下兩個程式:

關於怎麼快速學C/C++,可以加下小編的C/C++學習群:341+636+727,不管你是小白還是大牛,小編我都歡迎,不定期分享乾貨,歡迎初學和進階中的小夥伴。每天晚上20:00都會開直播給大家分享C/C++遊戲程式設計學習知識和路線方法,群裡會不定期更新最新的教程和學習方法,最後祝所有程式設計師都能夠走上人生巔峰,讓程式碼將夢想照進現實

先分析程式1,在交換語句執行前的狀況如圖1所示:

(圖1)

交換的內容是*x和*y,實際交換的內容是變數a和b的值,交換語句執行後的狀況如圖2:

(圖2)

所以,在主程式中輸出的內容是a=20,b=10。

接下來看看程式2,由於傳遞引數的方式與程式1完全一樣,所以交換語句執行前的狀態與程式1中交換語句執行前的狀況一樣,如圖1所示。

但是,程式2中交換的內容是x和y,也就是這兩個變數內所儲存的地址值,所以交換語句執行後的結果如圖3所示:

(圖3)

程式2中變數a和b的值並沒有改變,輸出的結果為a=10,b=20。

所以程式1中變數a和b的值發生了交換,程式2中變數a和b的值沒有交換,你的想法與我的一樣嗎?

相關推薦

C語言 地址一定改變函式變數的值

我們都知道在函式呼叫中,引數傳遞的方式有傳值和傳地址之分,如果主函式傳遞給子函式引數時採用傳地址的方式,主函式的變數值一定會變化嗎?請先看下面的程式:程式1#include<stdio.h>void swap(int *x,int *y){int t;t=*x;*

C語言地址值的區別

      C語言中,函式的引數分為傳值與傳地址,下面程式碼為傳值函式:    #include<stdio.h>    void function(int x,int y)//實現兩個引數交換    {        int temp;        temp

C語言-陣列引數給另一個函式,使用malloc

// // main.c // // // Created by myhaspl on 2018/10/26. // Copyright © 2018 [email protec

C語言資料結構——子串在的定位函式

#include<stdio.h> #include<stdlib.h> #include<string.h> #define Max 100 #define T

C語言---值與地址

<1>傳值:實參把值傳給了形參,但沒有傳地址即對實參的修改無效。 核心原理:函式會對形參和中間的臨時變數(函式內定義的變數)重新分配空間。 <2>傳地址:實參把自己的記憶體地址傳給了形參,這樣對實參的修改就有效了。 大多數型別都是傳值, 傳地址有以下3種方式: (1)、全域性變數(把

在STM32上實現NTFS之4:GPT分區表的C語言實現(1):GPT表頭的實現

center mbr分區 sum 對齊 字節數 決定 容器 alt 水平 題外話:在荒廢了很久沒有更新之後……某日突然收到讀者的站內信!內容大體是詢問GPT分區表信息的讀取方式,筆者激動萬分之下,決定繼續解剖NTFS……其實GPT嚴格上不算是NTFS的內容, GPT和M

C語言參的型別匹配

有一個這樣的問題: 形參const char *p和實參char *c可以匹配 形參const char**p和實參char**c不可以匹配 注:argument和parameter:嚴格而言,parameter指形參,argument指實參 ANSI C: "每個實

C語言程式猿必的記憶體四區及經典面試題解析

前言:     為啥叫C語言程式猿必會呢?因為特別重要,學習C語言不知道記憶體分割槽,對很多問題你很難解釋,如經典的:傳值傳地址,前者不能改變實參,後者可以,知道為什麼?還有經典面試題如下:  #include <stdio.h> #include <stdlib.h>#in

python:函式參是否改變函式外引數的值

參考連結: https://blog.csdn.net/u012614287/article/details/57149290 https://blog.csdn.net/qq915697213/article/details/66972836 1、介紹python函式傳參

C語言_地址路徑

    最近在寫程式的時候,遇到了相對路徑找不到檔案的問題。找了好長時間才找到了解決的辦法,現在將出現的原因及解決方法介紹如下:     出現的原因:     我這個工程出現的原因是因為在呼叫DLL和exe檔案之

C語言記憶體地址基礎

從計算機記憶體的角度思考C語言中的一切東東,是挺有幫助的。我們可以把計算機記憶體想象成一個位元組陣列,記憶體中每一個地址表示 1 位元組。比方說我們的電腦有 4K 記憶體,那這個記憶體陣列將會有 4096 個元素。當我們談論一個儲存地址的指標時,就當相於我們在談

想當黑客?淺談C語言程式設計:不這個知識就別想了!

淺談C語言資料結構——鏈式堆疊 看到標題點進來的朋友,應該對黑客這個名詞很敏感吧?我想應該是這樣的,但是你們知道作為一名黑客需要學習哪些知識嗎?小編不是什麼大佬,但小編可以明確的告訴你,學習C語言是必不可少的一步,為什麼?因為C語言是一個非常“底層”的語言,也是應用最廣泛的

C語言地址傳遞

// struct.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <string.h>int swap(int*a, int*b)...{    int temp=0;

C語言】統計數字在排序數組出現的次數

語言 個數 統計 ret r+ () class tdi times //數字在排序數組中出現的次數。 //統計一個數字在排序數組中出現的次數。比如:排序數組{1,2,3,3,3,3,4,5}和數字3,因為3出現了4次,因此輸出4. #include <stdio

《6.C語言巨集定義與預處理、函式函式庫》

《6.C語言巨集定義與預處理、函式和函式庫》 第一部分、章節目錄 4.6.1.C語言預處理理論 4.6.2.C語言預處理程式碼實戰 4.6.3.巨集定義1 4.6.4.巨集定義2 4.6.5.函式的本質 4.6.6.函式的基本使用 4.6.7.遞迴函式 4.6.8.函式庫 4.6.9.字

C語言學習筆記:printf()函式詳解

C語言中有關printf()函式的詳細使用方法: 修飾符: - digit(s) :欄位寬度的最小值。如果該欄位不能容納要列印的數或者字串,系統就會使更寬的欄位。 如%4d。 - .digit(s):精度,將結果保留到小數點後的多少位。 - h: 和整數轉

c語言】利用指標模式實現字串函式(strlen、strcat、strstr、strcpy、strcmp、memcpy、memove)

模擬實現strlen int my_strlen(const char *p) { assert(p != NULL); char *s = p; while (*p) { p++; } r

C語言字元篇(五)記憶體函式

memcpy不可以把目的地址寫成本身 但是memmove可以,因為它是先儲存到臨時空間 #include <string.h>   void *memcpy(void *dest, const voi

C語言 最大公約數最小公倍數函式

本文僅給出自定義函式,主函式請自行補充。 int gcd(int x, int y) { int m, n; m = (x > y) ? x : y; n = (x > y) ? y : x; if (m % n == 0) return n;