*與&
先了解位址和資料,想象記憶體裡面是一個個的小盒子,每個盒子對應一個編号,這個編号就是位址,盒子裡存放的就是資料。
&是取位址運算符,如有 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”;
}
形參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”;
}
相當于變量的别名,函數内後續的任何改變都會影響原變量
數組形參
當要使用數組作為函數形參時,因為一個數組不能使用另外一個數組初始化,也不能将一個數組指派給另外一個數組,而在“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