1,指针定义
指针就是记录地址
1指针定义
数据类型*指针变量名
int a = 10 //定义一个变量
int * p //定义一个指针变量
p = &a //取a 的地址赋给p &是取址符
int *p //定义一个指针变量并且指向一个地址,使p为一个地址
int *p是创建一个指针变量,所以int *p = &a;可以等于一个地址
*p是对p这个地址解引用,来找到地址对应的内存,两者不是一个概念
2,指针可以通过解引用的方法来找到指针指向的内存
指针前加一个星号
*p = 1000 //p是a的地址,*p就是通过地址的到a的值 ,然后直接将内存里的值改成了1000,
cout << a << //这里的a已经为1000了
指针所占用的内存空间大小 sizeof(int *)或sizeof(p) {32位4字节,64位8字节}
3.空指针,野指针
空指针:指针指向地址编号为0的空间(初始化指针变量)
int * p = NULL; (需要先有头文件stdlib.h)
*p = 100; 错误:空指针不可以访问
野指针:z指针指向非法的内存空间
比如int * p =(int*)0x1100 //0x1100是一个十六进制的数,前加(int*)可将其强转成一个地址
这个地址没有申请,没有权限去操作,编译无错,运行会出错
4,const修饰指针
1.const修饰指针
2.const修饰常量
3.const修饰指针,也修饰常量
如int a=10;
int b =10;
1.const 修饰指针-------常量指针
const int *p = &a; // 指针的指向可以修改,但指针指向的值不可以修改
可这样理解:const修饰的是*p,即*p解引用的值被固定了
*p = 20; 错误,不能改p所指向地址的值
p = &b; 正确,指向可以修改
2.const修饰常量----------指针常量
int * const p = &a; // 指针的指向不可以修改,但指针指向的值可以修改
可这样理解:const修饰的p,即指针p的地址被const固定,变成常量
*p = 20; 正确
p = &b; 错误
3.const修饰指针,也修饰常量
const int * const p = &a //都不可修改
5,指针和数组
int *p = arr //因为数组名就是数组的首地址,输出*p自动输出数组第一个数值
cout << *p //这里输出的是数组的首位
p++ //因为数组是整型,每个数字4字节,这里的p++代表p往后偏移了4个字节,变成了数组第二位的地址
cout << *p //这里输出的数组二位
int main()
{
int arr[3] = { 1231,23,3 };
int *p = arr;
for (int i = 0; i < 3; i++)
{
cout << *p << endl;
p++;
}
system("pause");
return 0;
}
指针遍历输出数组
6,指针和函数
1,值传递时,形参的改变不影响实参的值
2.地址传递时,形参的改变影响实参的值
void swap(int *a, int *b) //定义了两个指针来接收两个值的地址
{
int temp = *a; //这里代表这两个地址所表示的值发生了互换,所以max和min
所表示的值也发生了互换
*a = *b;
*b = temp;
cout << "*a" << *a <<endl;
cout << "*b" << *b << endl;
}
int main()
{
int max = 10; int min = 1;
swap(&max, &min); //将两个值的地址传到函数中,用两个指针来接收
cout << max << endl;
cout << min << endl;
system("pause");
return 0;
}
值传递:主函数定义的变量的值赋给了调用函数上新定义的变量,所以新定义变量之间的改变不影响主函数上变量的值
地址传递:主函数定义变量值的地址传给了调用函数上新定义的指针,所以指针的解引用改变了地址所代表的值,因此主函数变量的值也要发生改变