在说This指针之前需要简单回顾C++的指针,可以说是C++中较难理解的一部分内容,通过指针,可以简化一些编程任务。

    我们都知道,每一个变量都有一个内存位置,每一个内存位置都定义了可使用取址符的地址(&),他表示了内存中的一个地址。

    示例:

#include <iostream>
using namespace std;

int main ()
{
   int  var1;   char var2[10]; 
   cout << "var1 变量的地址: "; 
   cout << &var1 << endl; 
   cout << "var2 变量的地址: ";  
   cout << &var2 << endl; 
   return 0;
}

    程序将会输出变量的地址。

    一、什么是指针

    指针其实本身也是一个变量,其值为另一个变量的地址,也就是内存位置的直接地址。

    int *ip;

    double *dp;

    无论哪种数据类型的指针,其实质都是一个代表内存地址的长的十六进制数。不同类型的指针,是指指针所指向的变量或常亮的数据类型不同。

    二、如何使用指针

    定义一个指针变量

    把变量地址赋值给指针

    访问指针变量中可用地址的值。

    这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。

    示例:

#include <iostream>
using namespace std; 
int main ()
{
   int  var = 20;   // 实际变量的声明
   int  *ip;        // 指针变量的声明
 
   ip = &var;       // 在指针变量中存储 var 的地址
 
   cout << "Value of var variable: "; 
   cout << var << endl; // 输出在指针变量中存储的地址
   cout << "Address stored in ip variable: ";
   cout << ip << endl; // 访问指针中地址的值
   cout << "Value of *ip variable: ";  
   cout << *ip << endl; 
   return 0;
}

    程序执行后的结果为:

Value of var variable: 20
Address stored in ip variable: 0xbfc601ac
Value of *ip variable: 20

  注意:指针变量定义时一般赋NULL。

    二、指针与数组的关系

    实际上,指针和数组在很多情况下可以进行互换。

    示例:

#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

注意:

对于 int var[3]={10,100,200};

存在*var,但没有var++,

 var 是一个指向数组开头的常量,不能作为左值。

只要不修改数组的值,仍可以用指针形式的表达式。

*var+2

    三、指针数组

    int *ptr[MAX];

    在这里,表示一个指向整数的指针数组的声明。

    四、指向指针的指针

    指针的指针,实际就是第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。

    声明如下:

int **var;

    当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符.

    示例:

#include <iostream>
using namespace std;

int main ()
{
   int  var;
   int  *ptr;
   int  **pptr;

   var = 3000;

   // 获取 var 的地址
   ptr = &var;

   // 使用运算符 & 获取 ptr 的地址
   pptr = &ptr;

   // 使用 pptr 获取值
   cout << "Value of var :" << var << endl;
   cout << "Value available at *ptr :" << *ptr << endl;
   cout << "Value available at **pptr :" << **pptr << endl;

   return 0;
}

程序运行结果为:

Value of var = 3000
Value available at *ptr = 3000
Value available at **pptr = 3000

    五、传递指针给函数

   C++允许传递指针给函数,只需要在函数声明时声明参数为指针类型即可。

    例如有函数:

    void getSeconds(unsigned long *par);

    那么可传递的指针参数为:

    unsigned long sec;
    
    getSeconds( &sec );

    当然也可以接收数组作为参数:

    double getAverage(int *arr, int size);
    
    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;
     }
      // 带有 5 个元素的整型数组
   int balance[5] = {1000, 2, 3, 17, 50};
   double avg;
 
   // 传递一个指向数组的指针作为参数
   avg = getAverage( balance, 5 ) ;