• 对于C++指针的详细理解


    (1)每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。
      eg: int var1;

          &var1  表示var1的地址。

    (2)定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。
       int var=20;  
       int *ip;   //指针变量的声明
       ip=&var; //指针变量中存储var的地址
       cout<<ip<<endl;    //指针变量中存储的地址 0xbfc601ac

       cout<<*ip<<endl;  //20,访问指针中地址的值

    (3)指针数组
       int var[MAX]={10,100,200};
       int *ptr[MAX]; //把 ptr 声明为一个数组,由 MAX 个整数指针组成。因此,ptr 中的每个元素,都是一个指向 int 值的指针。
       ptr[i] = &var[i]; // 赋值为整数的地址

       cout<<*ptr[i]<<endl; // 10 100 200

    (4)指针的指针
    指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。
    当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。
    一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。  int **var;
    当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符
       int  var;
       int  *ptr;
       int  **pptr;
       var = 3000;
       // 获取 var 的地址
       ptr = &var;
       // 使用运算符 & 获取 ptr 的地址
       pptr = &ptr;
       // 使用 pptr 获取值 
       cout << "Value of var :" << var << endl;               //3000
       cout << "Value available at *ptr :" << *ptr << endl;   //ptr指针的值,3000

       cout << "Value available at **pptr :" << **pptr << endl; //3000

    (5)传递指针给函数
    声明函数参数为指针类型即可。

    double getAverage(int *arr, int size); //arr表示一个数组

    (6)指向数组的指针
      数组名是一个指向数组中的第一个元素的常量指针。
      double *p;
      double balance[10]; //balance 是一个指向 &balance[0] 的指针,即数组 balance 的第一个元素的地址
      p=balance; // p 赋值为 balance 的第一个元素的地址 
      使用数组名作为常量指针是合法的,反之亦然。因此,*(balance + 4) 是一种访问 balance[4] 数据的合法方式。

      把第一个元素的地址存储在 p 中,您就可以使用 *p、*(p+1)、*(p+2) 等来访问数组元素。

    (7)传递数组给函数
    C++ 不允许向函数传递一个完整的数组作为参数,但是,您可以通过指定不带索引的数组名来传递一个指向数组的指针。
    在函数中传递一个一维数组作为参数,您必须以下面三种方式来声明函数形式参数
    void myFunction(int *param){}
    void myFunction(int param[]){}

    void myFunction(int param[10]){}

    (8)从函数返回数组
     从函数返回一个一维数组,您必须声明一个返回指针的函数

     int * myFunction() {}

    (9)C++引用
    引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。 
      引用很容易与指针混淆,它们之间有三个主要的不同:
    不存在空引用。引用必须连接到一块合法的内存。
    一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
    引用必须在创建时被初始化。指针可以在任何时间被初始化。
        int i=17;
    int& r=i;  //&读作引用,r 是一个初始化为 i 的整型引用
    cout<<i<<endl;  //5
    cout<<r<<endl; //5
      引用通常用于函数参数列表和函数返回值。
      把引用作为参数。  C++ 支持把引用作为参数传给函数,这比传一般的参数更安全

     
      1. #include <iostream>  
      2. using namespace std;  
      3.   
      4. // 函数声明  
      5. void swap(int& x, int& y);  
      6.   
      7. int main ()  
      8. {  
      9.    // 局部变量声明  
      10.    int a = 100;  
      11.    int b = 200;  
      12.   
      13.    cout << "交换前,a 的值:" << a << endl;  
      14.    cout << "交换前,b 的值:" << b << endl;  
      15.   
      16.    /* 调用函数来交换值 */  
      17.    swap(a,b);  
      18.   
      19.    cout << "交换后,a 的值:" << a << endl;  //200  
      20.    cout << "交换后,b 的值:" << b << endl;  //100  
      21.   
      22.    return 0;  
      23. }  
      24. void swap(int& x, int& y)  
      25. {  
      26.    int temp;  
      27.    temp = x; /* 保存地址 x 的值 */  
      28.    x = y;    /* 把 y 赋值给 x */  
      29.    y = temp; /* 把 x 赋值给 y  */  
      30.    return;  
      31. }  
  • 相关阅读:
    关于大文本(txt)导入sqlserver2008数据库的一点感想
    欲则不达
    记录下马上两年的大学吧
    osgi使用 equnix框架 Bridge方式搭建方法(部分来源于ibm网站)
    mavan deploy不出repository.xml
    在项目中使用maven私服
    playbook 若干问题
    Maven 3 Felix 4 Eclipse 的搭建与部署(部分转载自别人文章)
    wallwd
    很好的面试记录
  • 原文地址:https://www.cnblogs.com/Pond-ZZC/p/9145208.html
Copyright © 2020-2023  润新知