指针和引用详解

  • Post author:
  • Post category:其他




指针存在的意义:

有了指针,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。



一、基本概念:

1.指针

指针(pointer):指针也是一个对象,其值为另一个变量的地址。

2.指针变量

指针变量是用来存放内存地址的变量。

与指针相关的属性有3个,指针本身的值(value)、指针所指的对象(content)、以及指针本身在内存中的存储位置(address)。

含义:

  1. 指针本身的值:是一个内存地址,表示指针所指对象在内存中的地址;
  2. 指针所指的对象:可以通过解引用指针访问;
  3. 由于指针也是一个对象,所以指针也存储在内存的某个位置,它有自己的地址,这也是为什么有“指针的指针”的原因。

    不同类型的

    指针变量

    占用的存储单元长度是相同的,而

    存放数据的变量

    因数据的类型不同,所占用的存储空间长度也不同。
#include<string.h>
#include<iostream>
using namespace std;
int main()
{
	int a = 1;
	double b = 2.3;
	int* pa = &a;pp
	double* pb = &b;
	cout << sizeof(a) << endl;//计算整型变量a所占的字节数
	cout << sizeof(b) << endl;//计算整型变量b所占的字节数
	cout << sizeof(pa) << endl;//计算指针变量a所占的字节数
	cout << sizeof(pb) << endl;//计算指针变量b所占的字节数
}
```p
输出结果:

```cpp
4
8
4
4



二、指针与引用的区别

指针与引用类似,指针也实现了对其他对象的间接访问。

指针与引用的区别:

1.

指针本身就是一个对象

,允许对指针复制和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象。

2.指针无需在定义时赋初值。



三、指针的运算(解引用、递增、递减、比较、与整数相加、两个指针相减)

1.指针的++运算(把值减去其数据类型的字节数)

在程序中用指针代替数组,因为变量指针可以递增,而数组是常量指针不能递增。我们可以借助递增变量指针,实现顺序访问数组中的每一个元素:

#include<stdlib.h>
#include<iostream>
using namespace std;
int main()
{
   int a[] = { 1,2,3,4,5,6 };
   int* pb = &a[0];//常规操作,定义一个指针变量,并指向数组a的第一个元素
   int* pa = a;//数组特性。!!!!
   for (int i = 0;i < 6;i++)
   {
   	cout << *pa++ << " ";
   	cout << *pb++ << " ";
   }
   return 0;
}

补充:数组的一大特性:在许多用到数组名的地方,编译器都会自动地将其替换为一个指向数组首元素的指针。

int arr[]={0,1,2,3,4,5,6};
int *p=arr;
int *p=&arr[0];


补充

:指针和数组


相同点

:指针和数组很多情况下是可以互换的,一个指向数组开头的指针,可以通过使用

指针的算术运算

(++、–)或

数组索引

来访问。

不同点:数组和指针并不是玩去哪可以互换

#include <iostream>
 
using namespace std;
const int MAX = 3;
 
int main ()
{
   int  var[MAX] = {10, 100, 200};
 
   for (int i = 0; i < MAX; i++)
   {
      *var = i;    // 这是正确的语法
      var++;       // 这是不正确的
      *(var+2)=500;//正确,把var[2]的值赋为500
   }
   return 0;
}

把指针运算符*应用到var上完全是可以的,但修改var的值是非法的。这是因为var是一个指向数组开头的常量。不能作为左值。

本例主要是为了说明指针的递增运算的应用。已经知道数组长度的情况下通过数组也能实现对自身的遍历。

2.两个指针相加是非法的,而且没有什么意义

指针的值是它所指对象的地址,如果把两个指针加在一起,就是试图把内存中两个对象的存储地址加在一起,这显然是没有任何意义的。与之相反,指针的减法是有意义的,如果指针指向

同一个数组中的不同元素

,则它们相减的结果表征了它们所指的元素在

数组中的距离(并不是存储空间长度)



例子:指针相减的结果

#include<stdlib.h>
#include<iostream>
using namespace std;
int main()
{
	int a[] = { 1,2,3 };
	int* pa = &a[0];
	int* pb = &a[1];
	cout << "a[0]的地址:" << pa << endl;
	cout << "a[1]的地址:" << pb << endl;
	cout << pa+1 << endl;
	cout << pb<< endl;
	cout << &a[1] - &a[0] << endl;
}

输出结果:

a[0]的地址:00AFFD88
a[1]的地址:00AFFD8C
指针pa+1的地址:00AFFD8C
指针pb的地址:00AFFD8C
pb-pa:1
请按任意键继续. . .



版权声明:本文为qq_43768296原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。