目录
一、指针的基本概念
指针的作用:可以通过指针间接访问内存
- 内存百年好是从0开始记录的,一般使用十六进制数字表示
- 可以利用指针变量保存地址
二、指针变量的定义和使用
指针变量定义语法:数据类型 * 变量名;
示例:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
// 定义指针
int a=10;
int *p=NULL;
// 让指针记录变量a的地址
p=&a;
cout<<"a的地址为:"<<&a<<endl;
cout<<"指针p记录的a的地址为:"<<p<<endl;
cout<<"指针p指向的内容为:"<<*p<<endl;
return 0;
}
运行结果:
三、指针所占内存空间
在32位操作系统下,占用4个字节空间,64位下占用8个字节。
示例:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
// 定义指针
int a=10;
int *p=NULL;
// 让指针记录变量a的地址
p=&a;
// 在32位操作系统下,指针是占4个字节空间大小,不管是什么数据类型
// 在64位操作系统下,指针是占8个空间大小
cout<<"指针类型的数据占用的空间大小为:"<<sizeof(int *)<<endl;
cout<<"指针类型的数据占用的空间大小为:"<<sizeof(float *)<<endl;
cout<<"指针类型的数据占用的空间大小为:"<<sizeof(double *)<<endl;
cout<<"指针类型的数据占用的空间大小为:"<<sizeof(char *)<<endl;
return 0;
}
运行结果:
四、空指针和野指针
空指针:指针变量指向内存中编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的
示例:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
// 空指针
// 1、空指针用于给指针变量进行初始化
int *p=NULL;
// 2、空指针是不可以进行访问的
// 0~255之间的内存编号是系统占用的,因此不可以访问
// 访问空指针报错
cout<<*p<<endl;
return 0;
}
野指针:指针变量指向非法的内存空间
示例:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
// 野指针
// 在程序中,尽量避免出现野指针
int *p=(int *)0x1100;
cout<<*p<<endl;
return 0;
}
注意:空指针和野指针都不是我们申请的空间,因此不要访问
五、const修饰指针
const修饰指针有三种情况:
- const修饰指针 ---常量指针( const int *p = &a):指针的指向可以修改,但是指针指向的值不可以修改
- const修饰常量 --- 指针常量(int * const p = &a):指针的指向不可以修改,但是指针指向的值可以修改
- const既修饰指针,又修饰常量( const int * const p = &a):指针的指向不可以修改,并且指针指向的值也不可以修改
示例:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
// 1、const 修饰常量
int a=10;
int b=10;
// const修饰的是指针,指针指向可以改,指针指向的值不可以更改
const int *p1=&a;
p1=&b; // 正确
// *p =20 错误
// 2、const修饰常量
// 指针的指向不可以更改,指针指向的值可以改
int * const p2=&a;
*p2=100;// 正确
// p2=&b // 错误,指针的指向不可以修改
// 3、const修饰指针和常量
// 指针的指向和指针指向的值都不可以更改
const int * const p3=&a;
// *p3=10; // 错误
// p3=&b; // 错误
return 0;
}
六、指针和数组
作用:利用指针访问数组中的元素
示例:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
// 指针和数组
// 利用指针访问数组中的元素
int arr[10]={1,2,3,4,5,6,7,8,9,10};
cout<<"遍历这个数组"<<endl;
for(int i=0;i<10;i++){
cout<<arr[i]<<" ";
}
cout<<endl;
cout<<"第一个元素为:"<<arr[0]<<endl;
int *p=arr; // arr就是数组的首地址
cout<<"利用指针访问第一个元素:"<<*p<<endl;
p++; //让指针向后偏移4个字节,因为p是int类型的
cout<<"利用指针访问第二个元素:"<<*p<<endl;
// 利用指针遍历数组中的元素
int *p2=arr;
cout<<"利用指针遍历数组中的元素"<<endl;
for(int i=0;i<10;i++){
cout<<*p2<<" ";
p2++;
}
cout<<endl;
return 0;
}
运行结果:
七、指针和函数
作用:利用指针作为函数参数,可以修改实参的值
示例:
#include<iostream>
#include<cmath>
using namespace std;
// 实现两个数字交换(值传递)
void swap01(int a,int b)
{
int temp=a;
a=b;
b=temp;
cout<<"swap01 a="<<a<<endl;
cout<<"swap01 b="<<b<<endl;
}
// 实现两个数字交换(地址传递)
void swap02(int *p1,int *p2)
{
int temp=*p1;
*p1=*p2;
*p2=temp;
cout<<"swap02 a="<<*p1<<endl;
cout<<"swap02 b="<<*p2<<endl;
}
int main()
{
// 指针和函数
// 1、值传递
int a=10;
int b=20;
swap01(a,b);
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
// 2、地址传递
swap02(&a,&b);
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
return 0;
}
运行结果: