1. 程式人生 > >指標變數作為函式引數問題

指標變數作為函式引數問題

今天建哈夫曼樹的時候發現指標變數作函式引數的問題,花了兩個多小時,深刻反思!

插入元素到從小到大排序的單鏈表中,並保持連結串列的有序性,有兩種做法:

一種是帶頭節點的單鏈表(很簡單,不討論)

另一種是不帶頭節點的單鏈表插入:

標準的不帶頭節點插入方法用返回值返回第一個節點地址):

Link *insert(LNode *node,Link *head){
	LNode *pre,*p;
	pre=p=head;
	while(p!=NULL && p->num<node->num){//確定插入位置
		pre=p;
		p=p->next;
	}
	if(p==head){//插入到第一個節點前
		node->next=head;
		head=node;		
	}else{
		node->next=pre->next;
		pre->next=node;
	}	
	return head;
}

我的錯誤的不帶頭節點插入方法沒有返回值,妄圖通過呼叫函式來改變實參指標變數的值:第一個節點的地址

void insert(LNode *node,Link *head){
	LNode *pre,*p;
	pre=p=head;
	while(p!=NULL && p->num<node->num){//確定插入位置
		pre=p;
		p=p->next;
	}
	if(p==head){//插入到第一個節點前
		node->next=head;
		head=node;	//***********想通過改變形參指標變數的值來達到實參指標變數的改變是不可能的!!!*************
	}else{
		node->next=pre->next;
		pre->next=node;
	}	
	return head;
}

void main(){
	int a[5]={3,1,2,5,4};
	Link *head=create();//建立單鏈表
	for(int i=0;i<5;i++){
		LNode *node=createNode();
		insert(node,head);//當node插入到head前的時候,函式結束後的head地址並不是node的地址,還是之前的head的地址!
	}
}


C語言中實參變數和形參變數之間的資料傳遞是單向的“值傳遞”方式。指標變數做函式引數也要遵循這一規則。不可能通過呼叫函式來改變實參指標變數的值,但可以改變實參指標變數所指變數的值!

用下面的簡單例子說明:

//以下函式都是實現值的交換:
void swap1(int *p1,int *p2){//通過交換地址值來實現,不過改變形參的指標變數是沒有用的!正確的做法見swap3();
	int *p;
	p=p1;
	p1=p2;
	p2=p;
}

void swap2(int *p1,int *p2){
	int temp;
	temp=*p1;
	*p1=*p2;//改變形參指標變數所指變數的值,正確的做法!!!
	*p2=temp;
}

//如果就是想通過交換地址值來實現怎麼辦呢?
//使用指向指標的指標來實現
void swap3(int **p1,int **p2){
	int *p;
	p=*p1;
	*p1=*p2;//改變形參指標變數所指變數的值,這裡的指標變數所指的值實際就是存放數字的地址值,也是正確的做法!!!
	*p2=p;
}
int main(){
	int a=3;
	int b=4;
	int *p1,*p2;
	p1=&a;
	p2=&b;
	swap1(p1,p2);
	printf("%d,%d\n",*p1,*p2);//3,4
	
	swap2(p1,p2);
	printf("%d,%d\n",*p1,*p2);//4,3
	
	int **p3,**p4;
	p3=&p1;
	p4=&p2;
	swap3(p3,p4);
	printf("%d,%d\n",*p1,*p2);//3,4
}


相關推薦

C語言經典例題--結構體指標變數作為函式引數的傳遞

#include <stdio.h> #include <string.h> struct student { int age; char sex; char name[30]; }; void inputstudent(struct stu

指標變數作為函式引數問題

今天建哈夫曼樹的時候發現指標變數作函式引數的問題,花了兩個多小時,深刻反思! 插入元素到從小到大排序的單鏈表中,並保持連結串列的有序性,有兩種做法: 一種是帶頭節點的單鏈表(很簡單,不討論) 另一種

C語言中指標變數作為函式引數和一般變數作為函式引數的區別

函式的引數不僅可以是整型、浮點型、字元型等資料,還可以是指標型別。它的作用是將一個變數的地址傳送到另一個函式中。 指標變數作為函式引數和一般變數作為函式引數是有區別的,對於這種區別初學者一般都很迷惑。下面我將就一個簡單的例子來說明一下它們的區別。看透以後也許也就不那麼疑惑了。

結構體變數和結構體指標變數作為函式引數傳遞的問題

/*2015年8月28日13:20:28通過函式完成對結構體變數的輸入和輸出*/# include <stdio.h># include <string.h>struct Student{int age;char sex;char name[100];

C語言指標變數作為函式引數

在C語言中,函式的引數不僅可以是整數、小數、字元等具體的資料,還可以是指向它們的指標。用指標變數作函式引數可以將函式外部的地址傳遞到函式內部,使得在函式內部可以操作函式外部的資料,並且這些資料不會隨著函式的結束而被銷燬。 像陣列、字串、動態分配的記憶體等都是一系列資料的集合,

指標變數作為函式引數為了改變指標變數指向實參的值

C語言使用值傳遞時,僅僅將實參的值傳遞給形參。 對於第一種寫法 main函式傳遞給Swap函式的是&a和&b的值,即a和b所在的地址的值 那麼Swap函式裡面通過*x來更改的就是&a所在的地址裡面的值,也就是a本身的值了,所以第一種寫法main函式呼叫Swap函式之後,a和b的值會

C++用指標變數作為函式引數接受陣列的值的問題的總結

實參和形參的四種結合方式 實參 形參 例項 陣列名 陣列名 1.1 陣列名 指標變數 1.2 指標變數 陣列名 1.3 指標變數 指標變數 1.4 本文以輸入10個整數,然後對其進行排序,然後輸出的程式為例: 形參為陣列名,實參是陣列名 例項程式碼1.1: #incl

智慧指標變數函式引數的一個值得注意的地方

作者:朱金燦          先考考大家,下面一段程式,會有什麼問題:#include <iostream> #include <string> #include "boost

結構體變數作為函式引數

推薦使用引用的方式。因為傳遞的是變數的地址,因而效率較高,並且可讀性也高 #include <iostream> #include <string> using names

陣列名,指標變數函式引數的四種情況

函式的引數可以是變數,也可以是陣列。當整個陣列作為函式的引數時,實際上是陣列的地址作為引數。由於實參可以是表示式,陣列元素也可以是表示式的一部分,因此,陣列元素可以作為函式的實參,這時對應的形參應該是變數,與變數作實參一樣,陣列元素把他的值傳遞到系統為形參變數分配的臨時儲存

函式使用結構體指標變數作為引數時,如果結構體中嵌套了結構體,應該如何呼叫其中的元素?

今天寫程式碼時突然遇到了這個問題,以前不曾探討過多層巢狀結構體指標變數的訪問,只知道結構體指標變數要訪問其元素時應該用 -> 來訪問,但對於結構體中巢狀有結構體的時候呢? 請看下面程式碼: #include “stdio.h” using namespac

指標作為函式引數,不能改變實參指標變數的值從而改變實參值

如題,這是因為 :1,按值傳遞,在呼叫函式的時候,將指向資料的指標實參傳遞到呼叫函式的形參中去2,單向傳遞,形參中的指標子函式改變地址後不能傳給主調函式,變數同樣指向了我們希望處理的資料,然後對形參的指標變數指向的資料進行各種希望的處理,在呼叫函式執行完成後,各個形參指標變數

指標和引用 作為函式引數

*和& * * 有兩個作用,一個是作為識別符號來表示這是一個指標(宣告變數時的等號左邊),也就是說存放的是地址,另外一個是作為運算子來取值(賦值等號左邊)。 int *p=NULL; int a = 1; p = &a; cout<<p<<

普通值、指標、引用作為函式引數時的理解

       很多時候,我們都會看到在教科書上寫著各種值傳遞,引用傳遞,一看一大堆,有時候看的還容易迷糊,什麼情況該怎麼傳總是區分不清,下邊我們用一小版塊並結合程式碼例項講解下。 一、值傳遞 // 普通值傳遞 void test(int num) {

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

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

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

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

有關 陣列作為函式引數 & 區域性變數和全域性變數及其應用

一、陣列blabla 1.0陣列元素作函式實參。 (1).陣列元素可以用作函式實參,但不能是形參。(給陣列分配的儲存單元是連續的) 2.0一維陣列名作函式引數。 (1)陣列元素作實參時,向形參變數傳遞的時陣列元素的值。 陣列名作實參時,向形參傳遞的時陣列首元素的地址。

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

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

用指向函式指標變數函式引數求兩個整數中的最大值、最小值、和

//用指向函式的指標變數作函式的引數#include <stdio.h>#include <string.h>void main(){ int max(int,int);//函式宣告 int min(int,int);//函式宣告 int add(in

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

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