# 一、C++ 指針的算術運算 ## 遞增一個指針 我們喜歡在程式中使用指針代替數組,因為變數指針可以遞增,而數組不能遞增,因為數組是一個常量指針。下麵的程式遞增變數指針,以便順序訪問數組中的每一個元素: ``` 實例 #include using namespace std; const int ...
一、C++ 指針的算術運算
遞增一個指針
我們喜歡在程式中使用指針代替數組,因為變數指針可以遞增,而數組不能遞增,因為數組是一個常量指針。下麵的程式遞增變數指針,以便順序訪問數組中的每一個元素:
實例
#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 << "Address of var[" << i << "] = ";
cout << ptr << endl;
cout << "Value of var[" << i << "] = ";
cout << *ptr << endl;
// 移動到下一個位置
ptr++;
}
return 0;
}
當上面的代碼被編譯和執行時,它會產生下列結果:
Address of var[0] = 0xbfa088b0
Value of var[0] = 10
Address of var[1] = 0xbfa088b4
Value of var[1] = 100
Address of var[2] = 0xbfa088b8
Value of var[2] = 200
二、++ 指針 vs 數組
指針和數組並不是完全互換的。例如,請看下麵的程式:
實例
#include <iostream>
using namespace std;
const int MAX = 3;
int main ()
{
int var[MAX] = {10, 100, 200};
for (int i = 0; i < MAX; i++)
{
*var = i; // 這是正確的語法
var++; // 這是不正確的
}
return 0;
}
把指針運算符 * 應用到 var 上是完全可以的,但修改 var 的值是非法的。這是因為 var 是一個指向數組開頭的常量,不能作為左值。
由於一個數組名對應一個指針常量,只要不改變數組的值,仍然可以用指針形式的表達式。例如,下麵是一個有效的語句,把 var[2] 賦值為 500:
*(var + 2) = 500;
上面的語句是有效的,且能成功編譯,因為 var 未改變。
三、C++ 指針數組
1、把 ptr 聲明為一個數組,由 MAX 個整數指針組成。因此,ptr 中的每個元素,都是一個指向 int 值的指針。下麵的實例用到了三個整數,它們將存儲在一個指針數組中,如下所示:
實例
#include <iostream>
using namespace std;
const int MAX = 3;
int main ()
{
int var[MAX] = {10, 100, 200};
int *ptr[MAX];
for (int i = 0; i < MAX; i++)
{
ptr[i] = &var[i]; // 賦值為整數的地址
}
for (int i = 0; i < MAX; i++)
{
cout << "Value of var[" << i << "] = ";
cout << *ptr[i] << endl;
}
return 0;
}
當上面的代碼被編譯和執行時,它會產生下列結果:
Value of var[0] = 10
Value of var[1] = 100
Value of var[2] = 200
2、您也可以用一個指向字元的指針數組來存儲一個字元串列表,如下:
實例
#include <iostream>
using namespace std;
const int MAX = 4;
int main ()
{
const char *names[MAX] = {
"Zara Ali",
"Hina Ali",
"Nuha Ali",
"Sara Ali",
};
for (int i = 0; i < MAX; i++)
{
cout << "Value of names[" << i << "] = ";
cout << names[i] << endl;
}
return 0;
}
當上面的代碼被編譯和執行時,它會產生下列結果:
Value of names[0] = Zara Ali
Value of names[1] = Hina Ali
Value of names[2] = Nuha Ali
Value of names[3] = Sara Ali
四、C++ 指向指針的指針(多級間接定址)
當一個目標值被一個指針間接指向到另一個指針時,訪問這個值需要使用兩個星號運算符,如下麵實例所示:
實例
#include <iostream>
using namespace std;
int main ()
{
int var;
int *ptr;
int **pptr;
var = 3000;
// 獲取 var 的地址
ptr = &var;
// 使用運算符 & 獲取 ptr 的地址
pptr = &ptr;
// 使用 pptr 獲取值
cout << "var 值為 :" << var << endl;
cout << "*ptr 值為:" << *ptr << endl;
cout << "**pptr 值為:" << **pptr << endl;
return 0;
}
當上面的代碼被編譯和執行時,它會產生下列結果:
var 值為 :3000
*ptr 值為:3000
**pptr 值為:3000
五、C++ 傳遞指針給函數
1、C++ 允許您傳遞指針給函數,只需要簡單地聲明函數參數為指針類型即可。
下麵的實例中,我們傳遞一個無符號的 long 型指針給函數,併在函數內改變這個值:
實例
#include <iostream>
#include <ctime>
using namespace std;
// 在寫函數時應習慣性的先聲明函數,然後在定義函數
void getSeconds(unsigned long *par);
int main ()
{
unsigned long sec;
getSeconds( &sec );
// 輸出實際值
cout << "Number of seconds :" << sec << endl;
return 0;
}
void getSeconds(unsigned long *par)
{
// 獲取當前的秒數
*par = time( NULL );
return;
}
當上面的代碼被編譯和執行時,它會產生下列結果:
Number of seconds :1294450468
2、能接受指針作為參數的函數,也能接受數組作為參數,如下所示:
實例
#include <iostream>
using namespace std;
// 函數聲明
double getAverage(int *arr, int size);
int main ()
{
// 帶有 5 個元素的整型數組
int balance[5] = {1000, 2, 3, 17, 50};
double avg;
// 傳遞一個指向數組的指針作為參數
avg = getAverage( balance, 5 ) ;
// 輸出返回值
cout << "Average value is: " << avg << endl;
return 0;
}
double getAverage(int *arr, int size)
{
int i, sum = 0;
double avg;
for (i = 0; i < size; ++i)
{
sum += arr[i];
}
avg = double(sum) / size;
return avg;
}
當上面的代碼被編譯和執行時,它會產生下列結果:
Average value is: 214.4
六、C++ 從函數返回指針
C++ 允許您從函數返回指針。為了做到這點,您必須聲明一個返回指針的函數,如下所示:
int * myFunction()
{
.
.
.
}
另外,C++ 不支持在函數外返回局部變數的地址,除非定義局部變數為 static變數。
現在,讓我們來看下麵的函數,它會生成 10 個隨機數,並使用表示指針的數組名(即第一個數組元素的地址)來返回它們,具體如下:
實例
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
// 要生成和返回隨機數的函數
int * getRandom( )
{
// 非常重要
static int r[10];
// 設置種子
srand( (unsigned)time( NULL ) );
for (int i = 0; i < 10; ++i)
{
r[i] = rand();
cout << r[i] << endl;
}
return r;
}
// 要調用上面定義函數的主函數
int main ()
{
// 一個指向整數的指針
int *p;
p = getRandom();
for ( int i = 0; i < 10; i++ )
{
cout << "*(p + " << i << ") : ";
cout << *(p + i) << endl;
}
return 0;
}
當上面的代碼被編譯和執行時,它會產生下列結果:
624723190
1468735695
807113585
976495677
613357504
1377296355
1530315259
1778906708
1820354158
667126415
*(p + 0) : 624723190
*(p + 1) : 1468735695
*(p + 2) : 807113585
*(p + 3) : 976495677
*(p + 4) : 613357504
*(p + 5) : 1377296355
*(p + 6) : 1530315259
*(p + 7) : 1778906708
*(p + 8) : 1820354158
*(p + 9) : 667126415