1 指针
作用:通过指针间接访问内存
1.内存编号是从0开始记录的,一般用十六进制数字表示。
2.可以利用指针变量保存地址。
1.1 指针变量的定义和使用
语法:数据类型 *变量名。如int *a;
#include<iostream>
using namespace std;
int main(){
int a = 1;
//创建指针变量
int *p;
//让指针记录变量a的地址
p = &a;
cout<<"a的地址:"<< &a <<"-" << p <<endl;
//通过解引用找到指针所指内存的数据
//指针前加 * 代表解引用, 找到指针所指内存的数据
*p = 10000;
// 均输出10000
cout<< "a= "<< a <<endl;
cout<< "a= "<< *p <<endl;
return 0;
}
1.2 指针所占内存空间
指针也是种数据类型,32位操作系统下:占4个字节,64位下占8个字节。
#include<iostream>
using namespace std;
int main(){
//指针所占内存空间
int a = 10;
int *p = &a;
//32位下都是占4个字节
cout<<"sizeof (int*) = "<<sizeof(int *)<<endl;
cout<<"sizeof (float*) = "<<sizeof(float *)<<endl;
cout<<"sizeof (double*) = "<<sizeof(double *)<<endl;
cout<<"sizeof (char*) = "<<sizeof(char *)<<endl;
return 0;
}
1.3 空指针和野指针
空指针:指针变量指向内存中编号位0的空间
作用:初始化指针变量。空指针指向的内存不可以访问。
#include<iostream>
using namespace std;
int main(){
//空指针,默认指向内存地址编号为0的空间
int *p = NULL;
//*p = 100 // 错误,因为0 - 255之间内存是 系统占用内存,不允许用户访问。
return 0;
}
野指针:指针变量指向非法的内存空间。
#include<iostream>
using namespace std;
int main(){
//野指针,
int *p = (int)0x1100;
//报访问权限错误
cout<<*p<<endl;
return 0;
}
空指针和野指针都不是用户申请的空间,不能访问。
1.4 const修饰指针
const修饰指针有三种情况:
- const修饰指针 - 常量指针
- const修饰常量 - 指针常量
- const即修饰指针,又修饰常量
//根据 * 和 const位置记录。
1.常量指针:指针的指向可以修改,但是指针指向的值不可以修改
int a = 10;
int b = 30;
// const先修饰的 *,因此指针的指向值不可改,即*p不可改
const int *p = &a;
*p = 20; //错误,指针指向的值不可修改
*p = &b;//正确
2.指针常量:指针的指向不可以修改,但是指针指向的值可以修改
int a=10,b=20;
// const 修饰的是 p,因此指针的地址不能改,所以指向不能改
int *const p = &a;
*p = 20; //正确,指针指向的值可以修改
*p = &b;//错误,指针的指向不可以修改
3.修饰指针:指针的指向不可以修改,指针指向的值不可以修改
int a=10,b=20;
const int *const p = &a;
*p = 20; //错误,指针指向的值不可以修改
*p = &b;//错误,指针的指向不可以修改
1.5 指针和数组
作用:利用指针访问数组中元素
#include<iostream>
using namespace std;
int main(){
int arr[5] = {
1,2,3,4,5};
//p 指向 arr首地址
int *p = arr;
//输出1
cout<<*p<<endl;
//输出1
cout<<*(p++)<<endl;
//输出2
cout<<*(++p)<<endl;
return 0;
}
1.6 指针和函数
作用:利用指针作为函数的参数,可以修改实参的值
#include<iostream>
using namespace std;
void swap(int *a,int *b){