微软公司宣布不再支持你正在使用的 IE浏览器,这会严重影响浏览网页,请使用微软最新的
  
您好, 登录| |

C++指针学习和记录

  • 18小时前
  • 米修儿

    LV.0
  • 184

    浏览

  • 0

    回复

  • 0

    获赞

  • 一直因为C++指针烧脑,所以一直可以逃避这c++,但时最近有空并且感觉学习很多C++有点绕不过去,所以抱着最少能看懂程序的要求来学习C++,基本知识跟别的语言大同小异,但是指针确实看的一知半解,所以记录一下提高自己,顺便帮助需要的人。

       指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:

    type *var-name;

    type 是指针的基类型,它必须是一个有效的 C++ 数据类型,var-name 是指针变量的名称,星号是用来指定一个变量是指针,通过 * 来返回位于操作数所指定地址的变量的值。使用连字号(&)运算符加上指针变量来访问内存地址。以下是有效的指针声明:

    int    *ip;    /* 一个整型的指针 */
    double *dp;    /* 一个 double 型的指针 */
    float  *fp;    /* 一个浮点型的指针 */
    char   *ch;    /* 一个字符型的指针 */

    所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。

    使用指针时操作步骤:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。

    实例如下:

    #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

    指针运算:

    指针是一个用数值表示的地址。因此,您可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-。

    假设 ptr 是一个指向地址 1000 的整型指针,是一个 32 位的整数,让我们对该指针执行下列的算术运算:

    ptr++

    在执行完上述的运算之后,ptr 将指向位置 1004,因为 ptr 每增加一次,它都将指向下一个整数位置,即当前位置往后移 4 个字节。这个运算会在不影响内存位置中实际值的情况下,移动指针到下一个内存位置。如果 ptr 指向一个地址为 1000 的字符,上面的运算会导致指针指向位置 1001,因为下一个字符位置是在 1001。

    我们喜欢在程序中使用指针代替数组,因为变量指针可以递增,而数组不能递增,因为数组是一个常量指针。下面的程序递增变量指针,以便顺序访问数组中的每一个元素:

    实例如下:

    #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
    
    递减指针如下:
    #include <iostream>
     
    using namespace std;
    const int MAX = 3;
     
    int main ()
    {
       int  var[MAX] = {10, 100, 200};
       int  *ptr;
     
       // 指针中最后一个元素的地址
       ptr = &var[MAX-1];
       for (int i = MAX; i > 0; i--)
       {
          cout << "Address of var[" << i << "] = ";
          cout << ptr << endl;
     
          cout << "Value of var[" << i << "] = ";
          cout << *ptr << endl;
     
          // 移动到下一个位置
          ptr--;
       }
       return 0;
    }
    当上面的代码被编译和执行时,它会产生下列结果:
    
    Address of var[3] = 0xbfdb70f8
    Value of var[3] = 200
    Address of var[2] = 0xbfdb70f4
    Value of var[2] = 100
    Address of var[1] = 0xbfdb70f0
    Value of var[1] = 10

    指针数组:

    指针和数组是密切相关的。事实上,指针和数组在很多情况下是可以互换的。例如,一个指向数组开头的指针,可以通过使用指针的算术运算或数组索引来访问数组

    而指针数组,我们让数组存储指向 int 或 char 或其他数据类型的指针,声明如下:

    int *ptr[MAX];

    在这里,把 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

    也可以用一个指向字符的指针数组来存储一个字符串列表,如下:

    #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

    觉得重要的知识点,暂时就总结到这些,倒数第二个实例不知道是不是有更好更简便的方法,还是最后一个实例中什么时候需要const (调试时发现没有const就会报错)。欢迎大家评论区留言和交流

    同是电子工程师,请一定不要吝啬你的赞!

    0人已赞

    编辑 举报

    LV.1

    4258374

    2510983

    23

    821817

    说说你的看法

  • LV.

    @

    编辑

    删除

    举报

    #该内容仅管理员可见#

    #回复内容已被删除#

    #该内容正在审核#

    回复:

    取消
    发送
  • 现在还没有回复呢,说说你的想法

    现在还没有回复呢,说说你的想法

    全部回复(0)

    现在还没有回复呢,说说你的想法

  • 回复

  • 收藏

  • 点赞

  • 举报有害信息

  • 已超出发布时间24小时,无法编辑与删除
    联网备案号:12010402000747 增值电信业务经营许可证:津B2-20120058