欢迎来到轩宇的博客

回溪照轩宇,广陌临梧楸。

小知识——c++关于指针的理解

参考文章:

简介:

指针可以简化c++编程,在一些任务中没有指针是无法完成的(动态内存分配)

使用 & 可以获得变量在内存中的地址:

eg:

 1 #include <iostream>
 2  
 3 using namespace std;
 4  
 5 int main ()
 6 {
 7    int  var1;
 8    char var2[10];
 9  
10    cout << "var1 变量的地址: ";
11    cout << &var1 << endl;
12  
13    cout << "var2 变量的地址: ";
14    cout << &var2 << endl;
15  
16    return 0;
17 }
View Code

定义:

指针:是一个变量,它的值是另一个变量的地址。在使用前要对它进行声明和赋值。

空指针:

NULL:为空指针,如果没有确切的地址可以赋值,为指针赋值一个null是一个好的习惯。

eg:

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int main ()
 6 {
 7    int  *ptr = NULL;
 8 
 9    cout << "ptr 的值是 " << ptr ;
10  
11    return 0;
12 }
View Code

执行结果是:ptr 的值是 0

大多数操作系统中程序是不允许访问地址为0的内存。该内存视为操作系统保留的,他可以表明指针不指向一个可以访问的内存,所以如果指针包含空值就假定它不指向任何东西。

对于空指针的的检查:

if (ptr)   或if (!ptr)  未初始化的变量存在垃圾直,会使程序的调试难以进行。

指针的运算:

指针可以进行 ++、 +、 -、 -- 运算。

如果ptr是指向1000的整形指针,ptr++是指向1004位置的指针。每增加一次往后移动4个字节,如果是字符型指针,ptr++指向1001,往后移动一个字节。

通常使用++、 -- 是在使用指针代替数组的时候使用。

eg:

 1 #include <iostream>
 2  
 3 using namespace std;
 4 const int MAX = 3;
 5  
 6 int main ()
 7 {
 8    int  var[MAX] = {10, 100, 200};
 9    int  *ptr;
10  
11    // 指针中的数组地址
12    ptr = var;
13    for (int i = 0; i < MAX; i++)
14    {
15       cout << "Address of var[" << i << "] = ";
16       cout << ptr << endl;
17  
18       cout << "Value of var[" << i << "] = ";
19       cout << *ptr << endl;
20  
21       // 移动到下一个位置
22       ptr++;
23    }
24    return 0;
25 }
View Code

编译结果:

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

指针的比较:

指针可以使用关系运算符进行比较:== 、<、> 

eg:

 1 #include <iostream>
 2  
 3 using namespace std;
 4 const int MAX = 3;
 5  
 6 int main ()
 7 {
 8    int  var[MAX] = {10, 100, 200};
 9    int  *ptr;
10  
11    // 指针中第一个元素的地址
12    ptr = var;
13    int i = 0;
14    while ( ptr <= &var[MAX - 1] )
15    {
16       cout << "Address of var[" << i << "] = ";
17       cout << ptr << endl;
18  
19       cout << "Value of var[" << i << "] = ";
20       cout << *ptr << endl;
21  
22       // 指向上一个位置
23       ptr++;
24       i++;
25    }
26    return 0;
27 }
View Code

运行结果:

Address of var[0] = 0xbfce42d0
Value of var[0] = 10
Address of var[1] = 0xbfce42d4
Value of var[1] = 100
Address of var[2] = 0xbfce42d8
Value of var[2] = 200

 指针数组和数组指针:

https://www.cnblogs.com/fanhua666/p/11505078.html

指向指针的指针:

指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。

声明: int **var;

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

 1 #include <iostream>
 2  
 3 using namespace std;
 4  
 5 int main ()
 6 {
 7     int  var;
 8     int  *ptr;
 9     int  **pptr;
10  
11     var = 3000;
12  
13     // 获取 var 的地址
14     ptr = &var;
15  
16     // 使用运算符 & 获取 ptr 的地址
17     pptr = &ptr;
18  
19     // 使用 pptr 获取值
20     cout << "var 值为 :" << var << endl;
21     cout << "*ptr 值为:" << *ptr << endl;
22     cout << "**pptr 值为:" << **pptr << endl;
23  
24     return 0;
25 }
View Code

结果:

var 值为 :3000
*ptr 值为:3000
**pptr 值为:3000

C++ 传递指针给函数

eg:

 1 #include <iostream>
 2 #include <ctime>
 3  
 4 using namespace std;
 5 void getSeconds(unsigned long *par);
 6  
 7 int main ()
 8 {
 9    unsigned long sec;
10  
11  
12    getSeconds( &sec );
13  
14    // 输出实际值
15    cout << "Number of seconds :" << sec << endl;
16  
17    return 0;
18 }
19  
20 void getSeconds(unsigned long *par)
21 {
22    // 获取当前的秒数
23    *par = time( NULL );
24    return;
25 }
View Code

结果

Number of seconds :1294450468
数组作为参数:
 1 #include <iostream>
 2 using namespace std;
 3  
 4 // 函数声明
 5 double getAverage(int *arr, int size);
 6  
 7 int main ()
 8 {
 9    // 带有 5 个元素的整型数组
10    int balance[5] = {1000, 2, 3, 17, 50};
11    double avg;
12  
13    // 传递一个指向数组的指针作为参数
14    avg = getAverage( balance, 5 ) ;
15  
16    // 输出返回值
17    cout << "Average value is: " << avg << endl; 
18     
19    return 0;
20 }
21  
22 double getAverage(int *arr, int size)
23 {
24   int    i, sum = 0;       
25   double avg;          
26  
27   for (i = 0; i < size; ++i)
28   {
29     sum += arr[i];
30    }
31  
32   avg = double(sum) / size;
33  
34   return avg;
35 }
View Code

结果

Average value is: 214.4

C++ 从函数返回指针

函数声明:

int * myFunction()
{
.
.
.
}

另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。

eg:

 1 #include <iostream>
 2 #include <ctime>
 3 #include <cstdlib>
 4  
 5 using namespace std;
 6  
 7 // 要生成和返回随机数的函数
 8 int * getRandom( )
 9 {
10   static int  r[10];
11  
12   // 设置种子
13   srand( (unsigned)time( NULL ) );
14   for (int i = 0; i < 10; ++i)
15   {
16     r[i] = rand();
17     cout << r[i] << endl;
18   }
19  
20   return r;
21 }
22  
23 // 要调用上面定义函数的主函数
24 int main ()
25 {
26    // 一个指向整数的指针
27    int *p;
28  
29    p = getRandom();
30    for ( int i = 0; i < 10; i++ )
31    {
32        cout << "*(p + " << i << ") : ";
33        cout << *(p + i) << endl;
34    }
35  
36    return 0;
37 }
38 当上面的代码被编译和执行时,它会产生下列结果:
39 
40 624723190
41 1468735695
42 807113585
43 976495677
44 613357504
45 1377296355
46 1530315259
47 1778906708
48 1820354158
49 667126415
50 *(p + 0) : 624723190
51 *(p + 1) : 1468735695
52 *(p + 2) : 807113585
53 *(p + 3) : 976495677
54 *(p + 4) : 613357504
55 *(p + 5) : 1377296355
56 *(p + 6) : 1530315259
57 *(p + 7) : 1778906708
58 *(p + 8) : 1820354158
59 *(p + 9) : 667126415
View Code

函数指针:

文档:函数指针
链接:

文档:10 数组指针和指针数组的区别
链接:http://note.youdao.com/noteshare?id=666741e0f5df0ba7beb2a97eeff1fdce&sub=wcp1565830202948624

 

 

posted @ 2019-09-11 10:45  轩宇a_a  阅读(363)  评论(0编辑  收藏  举报