一、指针的基本概念
可以利用指针变量保存一个地址,通过指针间接访问内存。
内存编号是从0开始记录的,一般用16进制表示。
二、指针变量的定义和使用
#include <iostream>
using namespace std;
int main()
{
//1、定义指针
int a=10;
//指针定义的语法:数据类型 * 指针变量名;
int *p;
//让指针记录变量a的地址
p=&a;
cout<<"a的地址为:"<<&a<<endl; //输出为a的地址
cout<<"指针p为:"<<p<<endl; //输出为a的地址
//2、使用指针
//可以通过解引用的方式来找到指针指向的内存
//指针前加一个*代表解引用,找到指针指向的内存中的数据,可以进行修改
*p=1000;
cout<<"a="<<a<<endl;
cout<<"*p="<<*p<<endl;
system("pause");
return 0;
}
三、指针所占内存空间
#include <iostream>
using namespace std;
int main()
{
//指针所占的内存空间大小
int a=10;
int *p;
p=&a; //或者可以直接 int *p=&a;
//32位操作系统下指针占4个字节空间大小,不管是什么数据类型
//64位操作系统下指针占8个字节空间大小
cout<<"sizeof (int *)="<<sizeof(int *)<<endl;
cout<<"sizeof (int *)="<<sizeof(float *)<<endl;
cout<<"sizeof (int *)="<<sizeof(double *)<<endl;
cout<<"sizeof (int *)="<<sizeof(char *)<<endl;
return 0;
}
四、空指针和野指针
空指针:指针变量指向的内存中编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的
#include <iostream>
using namespace std;
int main()
{
//1、空指针用于给指针变量进行初始化
int *p = NULL;
//2、空指针是不可以进行访问的
//0-255之间的内存编号是系统占用的,因此不可以访问
*p=100;
cout<<*p<<endl; //运行结果为空
return 0;
}
野指针:指针变量指向非法的内存空间
#include <iostream>
using namespace std;
int main()
{
//在程序中,尽量避免出现野指针
int *p=(int *)0x1100;
//无法访问野指针
cout<<*p<<endl;
return 0;
}
五、const修饰指针
三种情况:
1、const修饰指针——常量指针
const int *p=&a,指针的指向可以改,指向的值不可以改
2、const修饰常量——指针常量
int *const p=&a,指针的指向不可以改,指向的值可以改
3、const即修饰指针,又修饰常量
const int * const p = &a,指针的指向和指向的值都不可以改
#include <iostream>
using namespace std;
int main()
{
int a=10;
int b=10;
//1、const修饰指针——常量指针
//指针指向的值不可以改,指向可以改
const int *p=&a;
//*p=20;是错误的
p=&b; //正确
//2、const修饰常量——指针常量
//指针的指向不可以改,指向的值可以改
int * const p2=&a;
*p2=100; //正确
//p2=&b; 错误
//3、const修饰指针和常量
//指针的指向 和 指针指向的值 都不可以改
const int * const p3=&a
//*p3=100;p3=&b;都是错的
return 0;
}
六、指针和数据
作用:利用指针访问数组中的元素
#include <iostream>
using namespace std;
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10}; //创建数组
cout<<"第一个元素为:"<<arr[0]<<endl; //访问数组元素
//利用指针访问数组中的元素
int *p=arr; //arr就是数组的首地址
cout<<"利用指针来访问第一个元素:"<<*p<<endl;
p++; //指针向后偏移8个字节
cout<<"利用指针来访问第二个元素:"<<*p<<endl;
cout<<"利用指针遍历数组:"<<endl;
int *p2=arr;
for(int i=0;i<10;i++)
{
cout<<*p2<<endl;
p2++;
}
return 0;
}
七、指针和函数
作用:利用指针作函数参数,可以修改实参的值
#include <iostream>
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;
}
int main()
{
//1、值传递
int a=10,b=20;
//swap01(a,b);
//2、地址传递
//如果是地址传递,可以修饰实参
swap02(&a,&b);
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
return 0;
}