1. 程式人生 > >c語言指標作為函式的引數

c語言指標作為函式的引數

在c語言中實參和形參之間的資料傳輸是單向的“值傳遞”方式,也就是實參可以影響形參,而形參不能影響實參。指標變數作為引數也不例外,但是可以改變實參指標變數所指向的變數的值。

#include <stdio.h>
void swap1(int x,int y),swap2(int *px,int *py),swap3(int *px,int *py);
int main(void)
{
	int a=1,b=2;
	int *pa=&a,*pb=&b;
	swap1(a,b);
	printf("s1:a=%d,b=%d\n",a,b);

	a=1,b=2;
	swap2(pa,pb);
	printf("s2:a=%d,b=%d\n",a,b);

	a=1,b=2;
	swap3(pa,pb);
	printf("s3:a=%d,b=%d\n",a,b);
	
	return 0;
}
void swap1(int x,int y){
	int t;
	t=x;
	x=y;
	y=t;
}

void swap2(int *px,int *py){
	int t;
	t=*px;
	*px=*py;
	*py=t;
}

void swap3(int *px,int *py){
	int *pt;
	pt=px;
	px=py;
	py=pt;
}

結果:

第一個swap1函式執行結果是:x=2   y=1.但是第一個函式的形參是(int x,int y),實參是(int a,int b)。因為實參可以影響形參,而形參不可以影響實參。所以a,b的值是不變的。如圖:

             

第二個swap2函式由圖可知,pa和px都是a的地址,pb和py都是b的地址。此函式改變*px,*py的值。因為*px和a在同一儲存單元,*py和b在同一儲存單元。以改變實參指標變數所指向的變數的值。所以如圖*pa和*pb的值也改變了,最後輸出結果也就改變了。

第三個swap3同樣的道理,如上圖直接改變了形參指標px和py的值,改變的只是地址,地址所對應的值沒有改變,又因為形參是不會影響實參,所以pa和pb沒有改變。所以a,b值沒有改變。

相關推薦

C語言指標作為函式引數傳遞學習(一)

1. 一維指標做函式引數 傳入的指標為NULL 比如下面的例子,很多人都會理解錯: #include <stdio.h> void test(char *string) { string = "hello world"; } int main() { cha

c語言指標作為函式引數

在c語言中實參和形參之間的資料傳輸是單向的“值傳遞”方式,也就是實參可以影響形參,而形參不能影響實參。指標變數作為引數也不例外,但是可以改變實參指標變數所指向的變數的值。 #include <stdio.h> void swap1(int x,int y),

c++之指標作為函式引數傳遞的問題

轉自:http://blog.csdn.net/fjb2080/article/details/5623427   原創文章,轉載請註明出處,謝謝! 作者:清林,部落格名:飛空靜渡   部落格地址:http://blog.csdn.net/fjb2080 &n

c語言指標函式引數,使用指標地址(二級指標)在被調函式中修改主調函式指標

1.程式碼 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char *prive; int data; } T_

C++ 有關指標作為函式引數的問題,自定義記憶體分配函式傳遞二級指標的問題

如題所示,我們主要討論在自定義的記憶體分配函式中通常見到的程式碼如下所示: ``` void Create(A** addr); ``` 其中傳遞的引數是二級指標。為什麼? 我們先看一下完整的動態記憶體分配函式的簡單例子: ``` struct A { int a = 0; int b = 0

c語言的一級指標和二級指標作為函式引數,連結串列,malloc中的分配等等總結

主要內容: 1、一級指標和二級指標 2、函式指標傳遞的例子 3、什麼時候需要傳遞二級指標? 4、二級指標在連結串列中的使用 1、一級指標和二級指標 一級指標:即我們一般說的指標,就是記憶體地址; 二級指標:指向指標的指標,就是地址的地址; 如: int a=

C++用指向函式指標作為函式引數

示例: #include <iostream> using namespace std; int add(int x, int y){ return x + y; } int sub(int x, int y){ return x - y; } int opera

指標作為函式引數指標訪問字元陣列元素06(C)

編寫一個函式,查詢字串s1 中是否包含字串 s2,並返回找到的第一個子串的起始位置,如果 s1 中沒有 s2, 則返回-1。編寫程式測試該函式。例如: s1: abcdefghdef, s2: def。則函式返回第一個 def 的起始位置: 3。   /*=======

C語言指標回顧——函式指標指標函式

函式指標 函式指標和指標函式兩個詞很像,但實際上只要看後兩個詞就行,函式指標是一個指標,指標是用來存放變數地址的,函式指標存放的地址是函式的入口地址。那麼函式指標如何使用呢,請看下面的程式碼: #include <iostream> using namespa

指標作為函式引數 進行記憶體釋放 並置NULL

author:張繼飛 寫在前面,前面寫了程式碼封裝free函式,但是呼叫封裝並退出後,指標並不為NULL,導致接下來以此作為判斷條件的時候就出現問題了。先前封裝函式為void _free_p_(void *ptr),通過分析,指標作為函式引數傳遞時只是傳遞了指標所指向的地址,將其賦給一個

C語言之通過函式引數修改實參

#include <stdio.h> int x = 1; int y = 2; int *p = &x; void modify_1(int a) { a = 11;

函式指標作為函式引數函式作為函式引數

轉載於:http://blog.csdn.net/vlily/article/details/7244682 轉載於:http://blog.csdn.net/shengnan_wu/article/details/8116935 轉載於:http://blog.csdn.net/callm

指標作為函式引數傳遞 (轉載)

這幾天在學習C過程中,在使用指標作為函式引數傳遞的時候出現了問題,根本不知道從何得解:原始碼如下:    createNode(BinNode *tree,char *p)    {        tree = (BinNode *) malloc(sizeof(BinNo

C語言指標作為形參的例子

編寫子函動態申請記憶體,並將記憶體地址返回供主函式使用; 程式碼如下: #include<stdio.h> #include<malloc.h> int getData(float **data_buffer,int *data_

C語言指標作為形參的一些問題

指標作為形參肯定有很多都不清楚其中具體的原理,我也是最近摸清了些門道: 下面就用一些例子來給大家說明: void myMalloc(char *s) //我想在函式中分配記憶體,再返回 { s=(char *) malloc(100); } void m

指標作為函式引數(處理陣列的四種方式)

//陣列名傳遞給指標子引數 #include <stdio.h> #define N 3 float average(float * g); int main() { float grade[N]={60,75,80}; printf("學生的平均成

C語言指標函式指標陣列,二級指標

int (*p[num])( char*,int,int ); int (*(*p)[num])(int a); 上一篇部落格最後的兩個例子的答案分別是:函式指標陣列,函式指標陣列的指標。 函式指標陣列指標和前面的陣列指標其實沒有太大區別。然後今天主要理一下函式指標陣

詳談C++中陣列作為函式引數

一、一個例子引發的思考   執行以下程式碼,請問輸出是什麼?例子來源於《劍指Offer》,我對書上例子做了修改,讓其可以執行。 #include<iostream> using namespace std; int GetSize(int da

指標作為函式引數指標型別的函式/指向函式指標(function pointer)

指標作為函式引數:為什麼需要指標做引數: 1. 需要資料雙向傳遞時(引用也可以達到此效果)                                     2. 需要傳遞一組資料,只傳首地址執行效率比較高example:#include <iostream>

函式指標作為函式引數,實現氣泡排序的升序排序和降序排序

#include<stdio.h> #define N 10//定義陣列元素個數 int Ascending(int a,int b);//升序排列的函式宣告 int Descendin