c++
通过指针保存一个地址,指针就是个地址
3.指针
通过指针保存一个地址,指针就是个地址
3.1定义指针
int main()
{
//1.定义指针
int a=10;
//指针定义语法:数据类型*指针变量名;
int*p;
p=&a;
cout<<"a的地址为:"<<&a<<endl;
cout<<"指针p为:"<<p<<endl;//指针p表示的就是a的地址
//2.使用指针
//可以通过解引用的方式来找到指针指向的内存
//指针前加*代表解引用,找到指针指向的内存中的数据
*p=1000;
cout<<*p<<endl;//1000
cout<<a<<endl;//1000
}
3.2指针所占的内存空间
要注意:指针也是一种数据类型,也是要占内存空间的
在32位操作系统下:占用4个字节空间
在64位操作系统下:占用8个字节空间
上方是不管啥数据类型的
int main()
{
//指针所占内存空间
int a=10;
//int *p;
//p=&a;
//上述可以写为以下:
int *p=&a;
cout <<"sizeof(int *)"<<sizeof(p)<<endl;//因为是看数据类型,写int *也可以,因为是int *类型 4字节(32位的话)
cout <<"sizeof(int *)"<<sizeof(int *)<<endl //4字节(32位的话)
cout <<"sizeof(char *)"<<sizeof(char *)<<endl; //4字节(32位的话)
}
3.3空指针
空指针:指针变量指向内存中编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的
int main()
{
//1.空指针用于给指针变量进行初始化
int *p=NULL;
//2.空指针不能进行访问
*p=100;//直接报错,压根不能访问
//0~255之间的内存编号是系统占用的,因此不可以访问
}
3.4野指针
指针变量指向非法的内存空间
int main()
{
int *p=(int *)0x1100; //定义了一个指针,直接去指向随便指定的地址-->野指针,是没有访问权限的
//访问野指针报错
cout<<*p<<endl;
}
空指针和野指针都不是我们申请的空间,因此不要访问
3.5const修饰指针
三种情况:
- const修饰指针 常量指针
- const修饰常量 指针常量
- const即修饰指针,又修饰常量
- 常量指针
const int *p=&a;
指针的指向可以修改,但是指针指向的值不可以修改,改为指向地址后,这个地址存的值还是这个值
- 指针常量
int *const p=&a;
指针的指向不可以改,指针指向的值可以改
- const即修饰指针,又修饰常量
const int *const p=&a;
指针的指向和指针指向的值都不可以改变
3.6指针和数组
int main()
{
//利用指针访问数组中的元素
int arr[10]={1,2,3,4,5,6,7,8,9,10};
cout<<"数组的第一个元素为:"<<arr[0]<<endl;
int *p=arr;//注意数才要加取地址符号&
cout<<"数组的第一个元素为:"<<*p<<endl;
p++; //让指针向后偏移4个字节
cout<<"数组的第二个元素为:"<<*p<<endl;
//利用指针遍历数组
int *p2=arr;
for (int i=0;i<10;i++)
{
cout<<*p2<<endl;
p2++;
}
}
3.7指针和函数
利用指针做函数参数,可以修改实参的值
值传递:只改变形参,不改变实参
地址传递:
void swap(int *p1,int *p2)
{
int temp=*p1;
*p1=*p2;
*p2=temp;
}
int main()
{
int a=10;
int b=20;
//地址传递
swap(&a,&b);
cout<<a<<endl;//20
cout<<b<<endl;//10
}
总结:不想修改实参,就用值传递;想修改实参,就用值传递
3.8指针,数组,函数组合案例
案例描述:封装一个函数,利用冒泡排序,实现对整数数组的升序排序
例如数组:int arr10={4,3,6,9,1,2,10,8,7,5}
#include<iostream>
using namespace std;
void bubbleSort(int *p,int len)
{
for(int i=0;i<len-1;i++)
{
for(int j=0;j<len-i-1;j++)
{
if(p[j]>p[j+1])
{
int temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
}
}
int main()
{
// 1.创建数组
int arr[10]={4,3,6,9,1,2,10,8,7,5};
int len=10;
int *p=arr;
// 2.创建函数,实现冒泡排序
bubbleSort(p,len);
// 3.打印排序后的数组
for (int i=0; i<len; i++)
{
cout<<*p<<"";
p++;
}
}