目录
1、基本概念:
内存编号由从0开始的16进制数字表示的,可以利用指针保存变量的地址,间接访问内存
2、语法:
指针的定义:数据类型 * 指针变量名
解引用:*指针变量名
int a = 10;
int * p = &a;
cout<<p<<endl;
cout<<&a<<endl; //两者打印的地址相同
cout<<*p<<endl; //10 解引用,获取对应内存的值
3、指针所占内存空间的大小:
在32位操作系统下,不管什么数据类型的指针均占4字节
在64位操作系统下,不管什么数据类型的指针均占8字节
int a = 10;
int *p = &a;
cout<<sizeof(int *)<<endl; //4
cout<<sizeof(double *)<<endl; //4
cout<<sizeof(char *)<<endl; //4
4、空指针:
定义:指针变量指向内存中编号为0的空间 int *p = NULL;
作用:初始化指针变量
注:空指针指向的内存不可以被访问(内存编号为0~255为系统占用内存,不允许用户访问)
5、野指针:
定义:指针指向非法的内存空间
如:int *p = (int *) 0x1100;
空指针和野指针都不是我们申请的空间,都不能被访问
6、const 修饰指针:
三种情况:
1)const修饰指针——常量指针
特点:指针的指向可以修改,但指针指向的值不可以改
例:
int a = 10;
int b = 20;
const int * p = &a;
*p = 20; //错误,指针指向的值不可以被修改
p = &b; //正确,指针的指向可以被修改
2)const修饰常量——指针常量
特点:指针的指向不可以修改,但指针指向的值可以改
int a = 10;
int b = 20;
int * const p = &a;
*p = 20; //正确,指针指向的值可以被修改
p = &b; //错误,指针的指向不以被修改
3)const既修饰指针,也修饰常量
特点:指针的指向、指针指向的值都不可以修改
int a = 10;
int b = 20;
const int * const p = &a;
*p = 20; //错误,指针指向的值不可以被修改
p = &b; //错误,指针的指向不以被修改
7、指针和数组:
利用指针访问数组中的元素
8、指针和函数:
利用指针作为函数参数,修改实参的值(地址传递)
void swap(int *p1, int *p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
int a = 10;
int b = 100;
swap(&a,&b); //实现两个数交换
}
9、案例:
利用地址传递,用函数实现冒泡排序
void bubble(int *arr, int len)
{
for(int i=0;i<len-1;i++)
{
for(int j=0;j<len-i-1;j++)
{
if(arr[j]>arr[j+1])
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
int main()
{
int arr[]={3,5,7,2,4,9,10,8,1,2};
int len = sizeof(arr)/sizeof(arr[0]);
bubble(arr,len);
for(int i=0;i<len;i++)
{
cout<<arr[i]<<" ";
}
}