*和&
*
* 有兩個作用,一個是作爲標識符來表示這是一個指針(聲明變量時的等號左邊),也就是說存放的是地址,另外一個是作爲運算符來取值(賦值等號左邊)。
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;
}
智能指針
老羅的博客說明的已經相當的不錯