1. 程式人生 > >【C語言】編寫一個函式,實現兩個數的交換 詳細解答

【C語言】編寫一個函式,實現兩個數的交換 詳細解答

今天在用函式寫兩數交換的時候發現有點小挫折,然後經過多次查詢驗證才發現是因為地址不對的緣故,我在此放出兩種交換的方法,先發錯誤的如下:
#include <stdio.h>
void swap(int a,int b)
{
    int temp=a;
    a=b;
    b=temp;
}
int main()
{
    int a=4,b=5;
    swap(a,b);
    printf("a = %d ,b = %d\n",a,b);
    return 0;
}

這段程式碼執行完以後會發現兩個數不會交換; 

顯然,在兩個函式裡,它們的地址並不相同,這意味著,它們並不是相同的儲存空間,改變swap裡的值,實際上僅僅只改變了swap()裡面的a和b的值罷了,一旦swap執行完,swap裡的a和b的儲存空間立即釋放掉,對於main()裡的a和b,沒有半點影響。


那麼接下來再放一段程式碼:

#include<stdio.h>

int swap(int*,int*);  //指標的資料型別是蓋住名字剩下的 所以如此宣告

int main(){
	int a = 0;
	int b = 0;
	printf("請輸入兩個數字:\n");
	scanf("%d%d",&a,&b);
	//直接執行交換方法 交換地址就是在交換他們的門的鑰匙,然後a可以用b的鑰匙在記憶體中找到b的值,b可以在記憶體中用a的鑰匙去找b的值	

	swap(&a,&b);
	printf("a=%d,b=%d\n",a,b);
	
	return 0 ;
	}


int swap(int *a,int *b){

	int temp;
	temp =*a ;
	*a= *b;
	*b= temp;

	}
我們分析一下它的原理,它究竟做了哪些變化呢,在swap函式裡,我們將a和b的地址給了swap函式,作為形參,在swap函式中,a和b是指向兩個int 型別的指標,它們接受了main裡面a和b的地址,也就是a=&a (in main());b=&b (in main());所以對*a實際上就是對a(in main())操作啦; 
那麼,聰明的你肯定能想到,在swap()函式裡變數a和b的地址肯定和main裡a和b的地址是不同的,swap裡的a,b的地址是指標的地址(在swap裡a,b是指標),而它們的值是在main()裡面a和b的地址; 

相關推薦

C語言編寫一個函式實現個數交換 詳細解答

今天在用函式寫兩數交換的時候發現有點小挫折,然後經過多次查詢驗證才發現是因為地址不對的緣故,我在此放出兩種交換的方法,先發錯誤的如下:#include <stdio.h> void swap(int a,int b) { int temp=a; a

C語言編寫一個函式一個數字字串轉換成這個字串對應的數字(包括正浮點數、負浮點數)

//編寫一個函式,將一個數字字串轉換成這個字串對應的數字(包括正浮點數、負浮點數) //例如:“12.34“ 返回12.34. " -12.34" 返回12.34 #include<

C語言編寫一個折半查詢函式

#include <stdio.h> int zheban(int x,int arr[],int left,int right) { while(left<=right) {

C語言輸入一個整數求它的原碼反碼補碼值

補碼 while src info idt IV com scan -- 1 #include<stdio.h> 2 #include<math.h> 3 int main() 4 { 5 int m,n,a[10],i=0,y[

C語言輸入一個整數輸出該數二進位制表示中1的個數(三種方法)

輸入一個整數,輸出該數二進位制表示中1的個數。如輸入32,輸出1.程式碼實現:方法1:與運算#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; int FindOne

C語言使用可變引數實現函式函式引數的最大值。

求若干個引數的最大值,我們假定第一個可變引數為最大值,定義為max,將之後的每一個可變引數和第一個可變引數相比較,始終在max裡存放的是最大值。 但是這裡需要注意,每一次呼叫va_arg,都會指向下一個可變引數,因此我們需要將其值儲存在臨時變數裡,以防指向錯誤。   #includ

C語言編寫一個程式顯示當前時間。

#include<sys/time.h> #include<time.h> #include<stdio.h> int main() {struct tm *ptm;time_t ts;char tim[50];ts = time(NUL

C語言之定義一個函式實現對字串做如下操作:當字元為字母時大小寫互換當字元為數字時原樣輸出當有其它字元出現時結束操作返回已處理的字串

Action(){       char str[]={"tEst234%^road"};int len = sizeof(str)/sizeof(char);//strTest2呼叫函式lr_output_message("%s",strTest2(str,len)); r

C語言練習題編寫一個函式它從一個字串中提取一個子字串

《C與指標》 習題 4.14   編寫一個函式,它從一個字串中提取一個子字串。函式原型如下: int substr(char dst[], char src[],int start, int l

C語言編寫函式實現函式atoi把字串轉換成整形

//編寫函式實現庫函式atoi,把字串轉換成整形 #include <stdio.h> #include <string.h> int my_atoi(const char *

C語言輸入一個整數N求N以內的素數之和

【C語言】輸入一個整數N,求N以內的素數之和   /* ============================================================================ Name

C語言一個n*n矩陣通過行變換使其每行元素的平均值按遞增順序排序

#include<stdio.h> int main() { int n,a[100][100],r,c,i,j; scanf("%d",&n); for(i=0;i<n;i++) { for(j=0;j<n;j++) scanf("%d",&am

練習題編寫一個函式一個char組成的字串迴圈右移n位

例如:原來是”abcdefghi”,如果n = 2,移位後應該是”hiabcdefg”。 思路:當讀到這個題目的時候,沒有編寫過類似程式的人可能會想,程式的實現就是依照字元的迴圈右移這樣實現的,但仔細想會發現這樣很難實現,不妨換一種思路,我們先把需要移到前面的字元取出來放進

C語言編寫函式實現:100-200素數的輸出

    這裡面,先要理解素數如何求得,可用自己除以2到自己的前一位,根據餘數情況判斷是素數還是合數。優化:(1)從101開始,每次自加2,這樣提高效率一倍。(2)一直除以自己的平方根也可。#include<stdio.h> #include<math.h&g

c語言用可變引數列表實現一個簡化的printf函式

//實現一個簡化的printf函式。 #include <stdarg.h> #include <string.h> void my_printf(const char *str,...) { va_list arg; //準備訪問可變引

c語言一個不多於5位的正整數要求: 1、求出它是幾位數 2、分別輸出每一位數字 3、按逆序輸出各位數字

// 給一個不多於5位的正整數,要求: // 1、求出它是幾位數 // 2、分別輸出每一位數字 // 3、按逆序輸出各位數字 #include <stdio.h> #include <math.h> int main() { int a,b,c

C#基礎輸入一個字元判定它是什麼型別的字元(大寫字母小寫字母數字或者其它字元)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _02_判斷使用者輸入字元型別 { c

C語言記憶體分配函式malloc/ calloc/ realloc及記憶體釋放free

前言: 記憶體區域劃分與分配: 1、棧區(stack)——程式執行時由編譯器自動分配,存放函式的引數值,區域性變數的值等,程式結束時由編譯器自動釋放。 2、堆區(heap) —— 在記憶體開闢另一塊儲存區域。一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可

C語言統計一個字串中字母、數字、空格及其它字元的數量

統計一個字串中字母、數字、空格及其它字元的數量 解法1: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> void Count(con

c語言指向指標(函式)的指標學習

1.指向指標指標的指標 定義形式:[儲存型別] 型別名 **指標名; int **p1; int *p2; int i=3; p2=&i; p1=&p2; **p1=5; 解析圖 把i的地址賦給p2,再把p2的地址賦給p1,p1---->p2------