指针的作用:可以通过指针间接访问内存
上图中的p就是a变量的指针,也可以记作*a
指针变量定义语法:数据类型*变量名;
int main(){
//1,指针的定义
int a=10;
int *p;
p=&a;//指针指向变量a的地址
cout<<"a的地址为 "<<&a<
*p——解引用的含义,可以通过指针来保存一个地址:
指针与数组一样,也是一种数据结构,既然是一种数据结构,那么所占的内存空间是多少呢?
空指针:指针变量指向内存中编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的
int main(){
//指针变量p指向内存地址编号为0的空间
int *p=NUll;
//访问空指针报错
//内存编号为0~255为系统所占内存,不允许用户访问
cout<<*p<
野指针:指针变量指向非法的内存空间
int main(){
//指针变量p指向内存地址编号为0x1100的空间
int *p=(int *)0x1100;
//访问野指针报错
cout<<*p<
(int *)0x1100的作用在于将后面的0x1100十六进制数强制转换为内存地址。
const——n.常数;恒量 adj.恒定的;不变的
假设有以下情景,a,b,p的值如下
1,const修饰指针——常量指针
特点:指针的指向可以修改,但指针指向的值不可以修改
const int *p=&a;
*p=20;//错误,指针指向的值不可以修改
p=&b//正确,指针的指向可以改
2,const修饰常量——指针常量
特点:指针的指向不可以改,指针指向的值可以改,与常量指针正好相反。
int * const p=&a;
*p=20;//正确,指向的值可以改
p=&b;//错误,指针指向不可以改
(红线为不允许)
3,const既修饰指针,又修饰常量
特点,指针的指向和指针指向的值都不可以改
const int * const p=&a;
*p=20;//错误
p=&b;//正确
作用:利用指针访问数组中元素
#include
using namespace std;
int main(){
int arr[]={1,2,3,4,5,6,7,8,9,10};
int *p=arr;
for(int i=0;i<10;i++){
cout<<*p<
作用:利用指针做函数参数,可以修改实参的值
#include
using namespace std;
void swap1(int a,int b){
int temp=a;
a=b;
b=temp;
}
//地址传递
void swap2(int *p1,int *p2){
int temp=*p1;
*p1=*p2;
*p2=temp;
}
int main(){
//指针和函数
//1,值传递
int a=10;
int b=20;
//swap1(a,b);a=20,b=10
//2,地址传递
//如果是地址传递,可以修饰实参
swap2(&a,&b);
cout<<"a= "<
a,b更换前后,内存空间的内容变化。
案例:封装一个函数,利用冒泡排序,实现对整型数组的升序排序
例如数组:int arr[10]={4,3,6,9,1,2,10,8,7,5}
#include
using namespace std;
void swap(int *arr,int len){//冒泡排序
for(int i=0;iarr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
void printarr(int *arr,int len){
for(int i=0;i
此案例的重点在于让我们学会: