Mike 发表于 2021-7-26 15:18:50

[VC++入门]指针一

俗话说没有搞清楚指针就没有学会C/C++,所以指针是一个相当重要的东东,相当年在用 C#调用C++写的动态链接库时,以为C++中的指针就是C#中的引用类型(ref),但是看了一下却不是这样。指针当然和内存是离不开的,有很多版本的定义,但是我觉得最容易理解的是:每一个变量都有一个内存地址,这个地址就称为指针。

    有两个与指针有关的运算符:取地址运算符“&”(用于取一个变量的地址)和指针运算符“*”(以一个指针作为其操作数,其运算结果表示所指向的变量)。
1 #include  <iostream.h>
 2 void   main()
 3 {
 4     int  a, b, *pa, *pb;
 5     a=10;   b=20;
 6     pa=&a; pb=&b;        // 使pa指向a,pb指向b
 7     cout<<*pa<<','<<*pb<<'\n';
 8     pa=&b;   pb=&a;        // 使pa指向b,pb指向a
 9     cout<<*pa<<','<<*pb<<'\n';
10     *pa=100;   *pb=200;    // 分别对b和a赋值
11     cout<<a<<','<<b<<'\n';
12  }

    从上面我们可以看到声明了两个变量a,b类型为int,两个指针pa,pb(指针类型为int *,指向的类型为int)。第一步&a取得为a所分配的地址即将pa指向a的地址,所以*pa=a=10,同理*pb=b=20;第二步同理可以得到*pa=b=20;*pb=a=10;第三步由于第二步将pa指向b,pb指向a所以a=*pb=200,b=*pa=100。

    指针与数组关系密切,编程时可以用指针代替下标引用数组元素,指针使数组的使用更为灵活、有效。当声明一个数组后,编译程序会按照数组的类型和长度为它分配内存空间,数组名表示数组在内存中的首地址;当用一个指针变量存储数组首地址时,该指针就指向这个数组,就可以通过指针运算间接访问数组的元素。指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。
1 #include  <iostream.h>
 2 void   main()
 3 {
 4     int   a[ ]={2, 4, 6, 8, 10};
 5     int*  pa=a;            // 或pa=&a
 6     int   result=0;
 7     for(int i=0; i<5; i++)
 8     {
 9         result+=*pa;           // 通过指针访问数组元素
10         pa++;            // 指针运算
11     }
12     cout<<"result="<<result<<'\n';
13  }


文档来源:51CTO技术博客https://blog.51cto.com/smallfa/3183364
页: [1]
查看完整版本: [VC++入门]指针一