指针存在的意义:
有了指针,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。
一、基本概念:
1.指针
指针(pointer):指针也是一个对象,其值为另一个变量的地址。
2.指针变量
指针变量是用来存放内存地址的变量。
与指针相关的属性有3个,指针本身的值(value)、指针所指的对象(content)、以及指针本身在内存中的存储位置(address)。
含义:
- 指针本身的值:是一个内存地址,表示指针所指对象在内存中的地址;
- 指针所指的对象:可以通过解引用指针访问;
-
由于指针也是一个对象,所以指针也存储在内存的某个位置,它有自己的地址,这也是为什么有“指针的指针”的原因。
不同类型的
指针变量
占用的存储单元长度是相同的,而
存放数据的变量
因数据的类型不同,所占用的存储空间长度也不同。
#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
请按任意键继续. . .