天天看點

c++:*與&, *&p, 指針傳遞,引用傳遞,數組形參

*與&

先了解位址和資料,想象記憶體裡面是一個個的小盒子,每個盒子對應一個編号,這個編号就是位址,盒子裡存放的就是資料。

&是取位址運算符,如有 int a; 即有一個小盒子裡面存放的資料起名叫a,&a就是取a的位址,即該盒子的編号。

(位址)是取值運算符,這裡是解引用操作符,可以了解成打開對應位址編号的盒子,取出裡面的資料。(&a) 就是打開a對應的小盒子,取出裡面的資料,即(&a)和a等價。

我們定義一個指針變量int *p; p是指針變量,專門用來存放位址。

int a = 10;
int *p=&a;//相當于int *p; p=&a; 單獨 p 的值表示指向a的位址
*p = 5; //把p指向的位址,解引用(拆開編号&a位址的盒子,裡面a的值指派為5)
           

p存放的是a的位址,*p也等價于 a。指針變量p既然是變量,也同變量a一樣對應一個小盒子,也有一個位址編号,&p就是取指針p的位址。

*&p

int a=123;
int *p=&a;
cout<<"*&p: "<<*&p<<endl;
    //&p是一個記憶體位址,*&p表示&p指向位址記憶體空間的值,在這裡表示a的位址

           

*&p = (&p) = p

p是指針,&p為p的位址 (取包有内容p的盒子的編号)

再進行解引用(拆開盒子),是以得到 *&p = p

指針傳遞

形參出現在函數定義中,在整個函數體内都可以使用, 離開該函數則不能使用。

實參出現在主調函數中,進入被調函數後,實參變量也不能使用。

void test(int *a) {
*a += 3;
cout << “a所指向位址:” << a << “\n”
<< “a的位址:” << &a << “\n”
<< “a所指向位址的值:” << *a << “\n”;
}
void main()
{
int b = 10;
test(&b);
cout << “b的值:” << b << “\n”
<< “b的位址:” << &b << “\n”;
}
           
c++:*與&amp;, *&amp;p, 指針傳遞,引用傳遞,數組形參

形參int *p ,實參為傳入位址

引用傳遞

void test(int &a) {
a += 3;
cout << “a的值:” << a << “\n”
<< “a的位址:” << &a << “\n”;
}
void main()
{
int b = 10;
test(b);
cout << “b的值:” << b << “\n”
<< “b的位址:” << &b << “\n”;
}
           
c++:*與&amp;, *&amp;p, 指針傳遞,引用傳遞,數組形參

相當于變量的别名,函數内後續的任何改變都會影響原變量

數組形參

當要使用數組作為函數形參時,因為一個數組不能使用另外一個數組初始化,也不能将一個數組指派給另外一個數組,而在“1.1 非引用形參”中提到要用實參的副本來初始化形參,是以實參為數組時,不能直接傳遞給形參。

例如一個函數的作用是找出數組中的最大數,數組為該函數的參數,則可以用如下三種方式定義該函數:

int FindMax(int* array);
int FindMax(int array[]);
int FindMax(int array[10]);
           

雖然不能直接傳遞數組,但是函數的形參可以寫成數組的形式。此時,調用該函數是的實參數組被編譯器自動轉換為指針,也就是說,以上三種定義是等價的,其參數類型都是int*。

調用該函數時,直接将數組名稱作為實參即可。

int array_my[5] = {1, 2, 3, 4, 5};
int array_maxvalue = FindMax(array_my);
           

可以百度數組與指針關系

#include <iostream>
 
using namespace std;
const int MAX = 3;
 
int main ()
{
   int  var[MAX] = {10, 100, 200};
   int  *ptr;
 
   // 指針中的數組位址
   ptr = var;
   for (int i = 0; i < MAX; i++)
   {
      cout << "var[" << i << "]的記憶體位址為 ";
      cout << ptr << endl;
 
      cout << "var[" << i << "] 的值為 ";
      cout << *ptr << endl;
 
      // 移動到下一個位置
      ptr++;
   }
   return 0;
}
           

輸出

var[0]的記憶體位址為 0x7fff59707adc
var[0] 的值為 10
var[1]的記憶體位址為 0x7fff59707ae0
var[1] 的值為 100
var[2]的記憶體位址為 0x7fff59707ae4
var[2] 的值為 200
           

繼續閱讀