1. 程式人生 > >講解指向指標的指標傳值原理。

講解指向指標的指標傳值原理。

#include <stdio.h>
#include <stdlib.h>
#define n 7
/* 用指向指標的指標的方法對n個整數排序並且輸出。
要求將排序單獨寫成一個函式,n個整數在主函式中輸入,最後在主函式中輸出 */

int main(int argc, char *argv[]) {
	int **p,*str[n],arr[n];                        //定義的是整型變數,而不是字元型變數  
	int i;                                    //定 義 循 環 變 量 i 
	for(i=0;i<n;++i)
	{
		str[i]=&arr[i];             //將陣列進行逐個的賦值,arr[i]的行的首地址存放在str[i]中。 
	}
	//輸入
	printf("input");
	for(i=0;i<n;i++)
	{
		scanf("%d",str[i]);
	}
	// 呼叫sort函式進行排序 
	sort(str);
	for(i=0;i<n;++i)
	{
		printf("%d  ",*str[i]); //逐個進行輸出 
	} 
	return 0;
}
void sort(int **p)    //採用的是冒泡的方法進行的排序
{
	int i,j; 
	int temp;
	for(i=1;i<n;++i)
	{
		for(j=0;j<n-i;++j)
		{
			if(**(p+j+1)<**(p+j))
			{
				temp=**(p+j+1);
				**(p+j+1)=**(p+j);
				**(p+j)=temp;
			}
		}
	}
	return 0;
}

畫圖的方式說明原理:NO.1


第二種方法傳地址:

void sort(int **p)    //採用的是冒泡的方法進行的排序
{
	int i,j; 
	int *temp;
	for(i=1;i<n;++i)
	{
		for(j=0;j<n-i;++j)
		{
			if(**(p+j+1)<**(p+j))
			{
				temp=*(p+j+1);
				*(p+j+1)=*(p+j);
				*(p+j)=temp;
			}
		}
	}
	return 0;
}

畫圖的方式說明原理:NO.2


執行結果:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define n 5
/* 指向指標的指標的方法n個字串排序並輸出*/

int main(int argc, char *argv[]) {
	void sort(char **p);
	char **p,*str[n],arr[n][20]; 
	int i;
	for(i=0;i<n;i++)
	{
		str[i]=arr[i];
	}
	// input
	printf("input:\n"); 
	for(i=0;i<n;i++)
	{
	   scanf("%s",str[i]);	
	}
	// call the function 
	p=str;
	sort(p);
	//output
	printf("output:\n"); 
	for(i=0;i<n;++i)
	{
		printf("%s\n",str[i]);//呼叫  此處仍然是行的首地址,為指標,注意了! 
	}
	return 0;
}
void sort(char **p) //採用的是氣泡排序,地址的交換
{
	int i;
	int j;
	char s[20];//為什麼要交換地址,因為是字串,字串並不能用以下的方法來交換 
	for(i=1;i<n;++i)
	{
		for(j=0;j<n-i;++j)
		{
			if(strcmp(p[j],p[j+1])>0) // 記得字串比較函式,1、實參是輸入的地址如char *a,*b;2、 strcmp(a,b); 
			{
					strcpy(s,p[j]);
					strcpy(p[j],p[j+1]);
					strcpy(p[j+1],s);// 記得交換字串 
			}
		}
	}
}



/*關於sort()部分,下面為兩種方法進行交換字串  NO2. 
void sort(char **p) //採用strcpy一定要保證是 
{
	int i;
	int j;
	char *temp,s[10];
	temp=s;// 為什麼要交換地址,因為是字串,字串並不能用以下的方法來交換 
	for(i=1;i<n;++i)
	{
		for(j=0;j<n-i;++j)
		{
			if(strcmp(p[j],p[j+1])>0) // 記得字串比較函式,1、實參是輸入的地址如char *a,*b;2、 strcmp(a,b); 
			{
					strcpy(temp,p[j]);
					strcpy(p[j],p[j+1]);
					strcpy(p[j+1],temp);// 記得交換字串 
			}
		}
	}
}



*/

對NO.2 的方法進行圖示講解:

/*
NO3. 
字串交換的方法如下: 採用的是交換地址的方法		
		for(i=0;i<n;++i)
	{
		for(j=0;j<n-i;++j)
		{
			if(strcmp(*(p+i),*(p+j))>0) // 記得字串比較函式,1、實參是輸入的地址如char *a,*b;2、 strcmp(a,b); 
			{
					temp=*(p+i);
					*(p+i)=*(p+j);
					*(p+j)=temp;// 記得交換字串 
			}
		}
*/ 


相關推薦

講解指向指標指標原理

#include <stdio.h> #include <stdlib.h> #define n 7 /* 用指向指標的指標的方法對n個整數排序並且輸出。 要求將排序單獨寫成一個函式,n個整數在主函式中輸入,最後在主函式中輸出 */ int main

C++傳遞引用與指標的區別

引用就是某一變數(目標)的一個別名,對引用的操作與對變數直接操作完全一樣。引用的宣告方法:型別識別符號 &引用名=目標變數名; 引用最大的好處就是提高函式效率以及節省空間; 關鍵問題一、傳遞引用與傳指標、傳值的區別?      值

引用&指標&引用&址的區別

引用 概念(貼標籤式) 引用不是新定義一個變數,而是給已存在變數取了一個別名,編譯器不會為引用變數開闢記憶體空間,它和它引用的變數共用同一塊記憶體空間 型別& 引用變數名

struts2 ognl的原理

OGNL 1.1 OGNL的全稱是Object Graph Navigation Language(物件圖導航語言),它是一種強大的表示式語言 1.2 OgnlContext(ongl上下文)其實就是Map (教室、老師、學生) OgnlContext=根物件(1)+非根物件(N)

thinkphp+layui,在父頁面對彈窗中的控制元件進行賦操作(

問題描述:點選評論回覆按鈕->彈出表單輸入框->對所點選的按鈕進行回覆評論->提交回復。這裡遇到的問題就是怎麼通過layer建立一個彈窗並把這個需要操作的id值傳到iframe彈出層。解決:點選當前條需要回復的評論並獲取到這個評論的id值,在點選回覆按鈕是用

WPF通過委託跨頁面修改介面控制元件,並原理完全解析

網上有很多講WPF修改控制元件的,但是大部分都只是程式碼佔據了很大的篇幅,沒有詳細講解過程。所以有了我這篇文章。我希望每一個看到這篇文章的朋友都可以看懂,另外不要被太長的標題嚇到。 通過委託跨頁面修改控制元件,所謂的原理就是,構造一個可以觸發事件A的靜態類,然後對頁面做出

提交Form表單,POST和GET方式的問題

<form action="${pageContext.request.contextPath }/UserServlet?id=123" method="get"> userame:<input type="text" name="username"&

從彙編和高階語言的角度理解方式,引用,指標的本質機制與區別白話通俗易懂

函式的傳參與返回值的方式有傳值和傳遞引用,c語言中就是傳值,而c++擴充套件傳引用。 而傳值分為傳遞值(實參的值,此時形參是實參在記憶體中的一份拷貝,形參在使用時分配記憶體,結束時釋放,實參和形參在記憶體中的地址不同,因此對形參的改變不會改變實參) 傳值的另外一種是傳指標

C++引用和指標

我們需要傳資料而不改變資料儲存,直接傳值,如int a; 我們需要傳資料,並且改變值大小,需要傳地址,如  int * pa; 我們需要傳資料,並改變數結構中指標的指向,需要傳二級指標,如連結串列中的 node * * l; ... 以前是passl-by-val

C++的函式的呼叫、指標呼叫、引用呼叫的聯絡區別

當呼叫函式時,有兩種向函式傳遞引數的方式: 呼叫型別 描述 傳值呼叫 該方法把引數的實際值複製給函式的形式引數。在這種情況下,修改函式內的形式引數對實際引數沒有影響。 指標呼叫 該方法把引數的地址複製給形式引數。在函式內,該地址用於訪問呼叫中要用到

C++primer第五版 編寫一個函式,令其接收兩個引數,一個是int型的數,另一個是int指標函式比較int的指標所指的,返回較大的那個

該題目主要是為了熟悉函式引數的幾種傳遞方式。定義函式形參時,可以定義成傳值(本身)、傳指標(*)、傳引用(&)。如果只是訪問引數值,不對其進行修改,那麼這三種方式都是可以的。例如該題目,就僅僅是比較兩個引數的大小,並沒有對引數本身進行修改,因此傳值和傳指標都是可行的。

C/C++二維陣列(陣列指標)——二維陣列的和二維陣列的一維訪問

二維陣列既可以通過二維訪問也可以通過一維訪問。 對於二維陣列的傳值,引進了陣列指標。 #include <stdio.h> void foo(int *p,int n)//一維訪問 {

SSH使用modelDriven出現空指標異常 java.lang.NullPointerException

java.lang.NullPointerException 有可能是application.xml檔案裡面忘了配置bean的屬性,導致物件沒傳進action、、或者是application.xml裡面的“id”與action裡使用的set方法變數名不同【no

真正搞懂引用和指標引用

通過一個基本原則和兩個例子講述傳值引用和傳指標引用的區別,並且從系統底層解析這兩種呼叫的區別 acmore 2017.11.14 1. 問題概述 在C語言呼叫函式時,有兩種傳引數的方法,一種是傳值,另一種是傳引數。對於C語言的初學者(甚至是

C++拷貝建構函式_形參為什麼只能是引用(不能指標

先給出答案: 拷貝建構函式不能用數值或指標形參原因,不是為了節省建立副本的空間與時間。而是那樣做會無限迴圈遞迴下去。 舉個例子來看一下為什麼會這樣。(反例) class Example() { public: Example(int a):aa(a) {}

指標引用

值傳遞、指標傳遞、引用傳遞的區別 c語言的規則很簡單:“所有的引數都是傳值呼叫”。在這句話的基礎上,我們來分析值傳遞、指標傳遞、引用傳遞的區別。 一、值傳遞 值傳遞,這與C函式的性質有關。C函式的所有引數均以“傳值呼叫”方式進行傳遞,這意味著函式值將獲得引

指標引用區別和聯絡

C++寫了很多年,有一天,寫著寫著程式碼。竟然自己發現對傳值,傳指標,傳引用這個每天都在用的傳遞方式的區別還不是很清楚。以為自己懂了,其實還理解得還不夠深入,基礎還需要花時間琢磨。今天參考了很多篇部落格和書籍做些總結。 其實,不用分為三類,只有兩類即可。傳值和

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

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

函式指標、函式返回指標、const指標指向const指標指向const的const指標

①函式指標 函式指標是指向函式的指標變數。 因而“函式指標”本身首先應是指標變數,只不過該指標變數指向函式。這正如用指標變數可指向整型變數、字元型、陣列一樣,這裡是指向函式。如前所述,C在編譯時,每一個函式都有一個入口地址,該入口地址就是函式指標所指向的地址。有了指向函式的

Spinner中getResource()空指標問題以及Context問題

在封裝一個Spinner的時候,傳值報空指標異常: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content