1. 程式人生 > >指標和引用 作為函式引數

指標和引用 作為函式引數

*和&

*

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

int *p=NULL;
int a = 1;
p = &a;
cout<<p<<" "<<*p<<endl<<endl;

測試結果為

0x7ffd2a8c6d84 1

&

& 有兩個作用,一個是作為識別符號來表示這是一個引用,只是給之前的變數添加了別名而已,另外一個是作為取地址運算子。

int a=1;
cout<<&a<<" "<<a<<endl<<endl;

測試結果為

0x7fffd17a4444 1

指標的三個方面

&B = 0x00000004;  //B本身的地址
B= 0x00000008;  //存放的地址
*B = "something";  //存放地址中的內容

引用和指標作為函式引數

背景說明:C語言和C++中將變數名作為實參和形參。這時傳給形參的是變數的值,傳遞是單向的。如果在執行函式期間形參的值發生變化,並不傳回給實參。因為在呼叫函式時,形參和實參不是同一個儲存單元。//同c

指標作為引數: 傳遞變數的指標。形參是指標變數,實參是一個變數的地址,呼叫函式時,形參(指標變數)指向實參變數單元。這種通過形參指標可以改變實參的值。//同c

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

void funcr(string* parms)
{
	*parms="funcr xxs";
	printf("the string in %s is %p \n",__FUNCTION__,parms);
}

//指標型別可以用相同長度的int或者long來替代,但是要注意在呼叫的時候進行強制轉換。
//32位的指標長度和unsigned int一樣
//64位的指標長度和unsigned long一樣
void funcAddr(unsigned long addr)
{
	string *p;
	p=(string*)addr;
	printf("the string in %s is %p \n",__FUNCTION__,p);
}
int main() {
    string x="something";
	funcAddr((long)&x);
	string *x_ptr=&x;
	funcr(x_ptr);
	printf("the string in %s is %p \n",__FUNCTION__,x_ptr);
    return 0 ;
} 

返回結果為

the string in funcAddr is 0x7ffd08fce890 
the string in funcr is 0x7ffd08fce890 
the string in main is 0x7ffd08fce890

引用(地址)作為參數:形參是引用變數,和實參是一個變數,呼叫函式時,形參(引用變數)指向實參變數
單元。這種通過形參引用可以改變實參的值。

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

void funcr(string& parms)
{
	parms="funcr xxs";
	printf("the string in %s is %p \n",__FUNCTION__,&parms);
}

int main() {
    string x="something";
	funcr(x);
	printf("the string in %s is %p \n",__FUNCTION__,&x);
    return 0 ;
} 

結果為

the string in funcr is 0x7fff9fbbd1a0 
the string in main is 0x7fff9fbbd1a0 

引用引數和指標引數的區別:指標作為引數時,實參在定義的時候就是一個指標變數,形參型別也是一個指標型別,而引用作為引數的時候,實參不是指標變數,因為形參是地址,所以形參型別是引用型別,表示傳進來的引數不用拷貝,直接用原來地址中的那份。

例項:

  • String地址作為引數
  • String地址作為引數傳過去之後,可以直接新建一個String指標,把傳進來的地址賦值給指標之後,這兩個地址就指向了同一片記憶體。
  • 目標:在函式中處理實參
  • 方法: 把實參的地址作為形參傳到函式裡面,在函式中定義指標,進行賦值。函式中通過對函式中定義的指標進行操作來達到改變外部實參的作用
  • 注意內容:因為傳進去的地址,因此,引數型別是int

二級指標

二級指標的作用就是在函式在編譯器拷貝的引數外面加一層指標,讓真正需要在函式中改變的值的地址作為指標指向的位置來改變。

void GetMemory2(char **p, int num)
{
    //這裡賦值就直接是給str字串所在的地址進行賦值
    *p = (char *)malloc(sizeof(char) * num); 
}
int main(void)
{ 
     char *str = NULL;
    GetMemory2(&str,100); // 注意引數是 &str,而不是 str
    strcpy(str, "hello");
    cout<< str << endl;
    free(str);
    return 1;
}

智慧指標

老羅的部落格說明的已經相當的不錯