C++ 指针

  • 指针

    C++指针简单易学。使用指针可以更轻松地执行某些C++任务,而没有它们则无法执行其他C++任务(例如动态内存分配)。如您所知,每个变量都是一个内存位置,每个内存位置都定义了地址,可以使用与号(&)运算符访问该地址,该运算符表示内存中的地址。考虑以下内容,它将打印定义的变量的地址-
    
    #include <iostream>
    
    using namespace std;
    int main () {
       int  var1;
       char var2[10];
    
       cout << "Address of var1 variable: ";
       cout << &var1 << endl;
    
       cout << "Address of var2 variable: ";
       cout << &var2 << endl;
    
       return 0;
    }
    
    尝试一下
  • 什么是指针?

    指针是一个变量,其值是另一个变量的地址。像任何变量或常量一样,必须先声明一个指针,然后才能使用它。指针变量声明的一般形式是-
    
    type *var-name;
    
    在这里,type是指针的基本类型。它必须是有效的C++类型,并且var-name是指针变量的名称。用于声明指针的星号与用于乘法的星号相同。但是,在此语句中,星号用于将变量指定为指针。以下是有效的指针声明-
    
    int    *ip;    // pointer to an integer
    double *dp;    // pointer to a double
    float  *fp;    // pointer to a float
    char   *ch     // pointer to character
    
    所有指针的值的实际数据类型(无论是int,float,char还是其他形式)都是相同的,即表示内存地址的十六进制数字。不同数据类型的指针之间的唯一区别是指针指向的变量或常量的数据类型。
  • 在C++中使用指针

    这里有一些重要的操作,我们会经常用到指针。
    • (a)我们定义一个指针变量。
    • (b)将变量的地址分配给指针。
    • (c)最后访问指针变量中可用地址的值。这是通过使用一元运算符*来完成的,该运算符返回位于其操作数指定的地址的变量的值。下面的例子使用这些操作。
    
    #include <iostream>
    
    using namespace std;
    
    int main () {
       int  var = 20;   // actual variable declaration.
       int  *ip;        // pointer variable 
    
       ip = &var;       // store address of var in pointer variable
    
       cout << "Value of var variable: ";
       cout << var << endl;
    
       // print the address stored in ip pointer variable
       cout << "Address stored in ip variable: ";
       cout << ip << endl;
    
       // access the value at the address available in pointer
       cout << "Value of *ip variable: ";
       cout << *ip << endl;
    
       return 0;
    }
    
    尝试一下
  • 空指针

    C++支持空指针,它是在几个标准库中定义的值为零的常量。
    在没有确切地址要分配的情况下,最好将指针NULL分配给指针变量。这是在变量声明时完成的。分配了NULL的指针称为空指针。NULL指针是在几个标准库(包括iostream)中定义的值为零的常量。考虑以下程序-
    
    #include <iostream>
    
    using namespace std;
    int main () {
       int  *ptr = NULL;
       cout << "The value of ptr is " << ptr ;
     
       return 0;
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    The value of ptr is 0
    
    在大多数操作系统上,不允许程序访问地址0处的内存,因为该内存是由操作系统保留的。但是,存储器地址0具有特殊的意义。它指示指针不旨在指向可访问的存储位置。但是按照惯例,如果指针包含空(零)值,则假定该指针不指向任何内容。要检查空指针,可以使用以下if语句-
    
    if(ptr)     // succeeds if p is not null
    if(!ptr)    // succeeds if p is null
    
    因此,如果为所有未使用的指针赋予了空值,并且避免了使用空指针,则可以避免意外误用未初始化的指针。很多时候,未初始化的变量包含一些垃圾值,因此调试程序变得困难。