学习资料及工具:bilibili视频网站黑马程序员匠心之作,BV1et411b73Z,共大概300+集https://www.bilibili.com/video/BV1et411b73Z?p=2
工具:Visual 2015
虽然不是0基础,但是之前感觉之前学过的和没学过一样,所以用0基础视频进行学习,此系列帖子作为笔记使用(主要是字丑)。
目录
正文
7 指针
7.1 指针的基本概念
指针的作用:可以通过指针间接访问内存
- 内存编号是从0开始记录,一般用十六进制的数字表示(可用int强行改为10进制)
- 可以利用指针变量保存地址
7.2 指针变量的定义和使用
定义语法:指针类型 * 变量名;
指针、变量各自地址的关系(图源:C++黑马程序)
a是变量,p是指针,黑框是地址(可以明显的看到在套娃)
即 指针就是一个地址
#include<iostream>
using namespace std;
int main()
{
//1.定义指针
int a = 10;//创建一个变量
int * p = &a;//创建一个指针p并且把a的地址赋给p
cout << "a的地址为 :" << &a << endl;
cout << "指针p为 :" << p << endl;
//2.使用指针——通过解引用的方式
//解引用:在指针符号前加一个*(*p代表找到了内存的数据)
*p = 1000;//等于直接修改a的值
cout << "a = " << a << endl;
cout << "*p = " << *p << endl;
cout << "p = " << p<<endl;//观察p的变化
system("pause");
return 0;
}
结果如下:
7.3 指针所占用的内存空间
在32位操作系统下,占用4个字节空间,和类型无关(开发过程中基本属于32位操作系统——不是你电脑的系统位数)
在×86的条件下编译系统为32位
#include<iostream>
using namespace std;
int main()
{
int a = 10;//创建一个变量
int * p = &a;//创建一个指针
cout << "指针p所占的内存为 :" << sizeof(p) << endl;// sizeof(p)= sizeof(int *)
cout << "指针p所占的内存为 :" << sizeof(int *) << endl;
cout << "指针p所占的内存为 :" << sizeof(float *) << endl;
cout << "指针p所占的内存为 :" << sizeof(double *) << endl;
system("pause");
return 0;
}
结果如下:
7.4 空指针和野指针
作用:指针变量指向内存为0的指针
用途:初始化指针变量
注意:空指针指向的变量不允许访问
#include<iostream>
using namespace std;
int main()
{
int *p = NULL;//创建一个空指针
//在0~255的内存空间是系统的内存,不允许用户进行操作
*p = 300;//解引用
system("pause");
return 0;
}
可以先点击生成查看代码
生产代码时没有问题,但是运行却报错
野指针 :指向非法的内存空间
#include<iostream>
using namespace std;
int main()
{
int *p = (int *)0x1100;//创建一个野指针
cout<<*p<<endl;
system("pause");
return 0;
}
效果与空指针类似,语法没有问题,但是不能运行,故不再展示
7.5 const修饰指针
const修饰指针一般三种情况:
- const修饰指针——常量指针(指针指向可以修改,但值不可修改)
- const修饰常量——指针常量(指向不可以改,但值可以改)
- const即修饰指针,也修饰常量(都不可以改)
图源:C++黑马程序员
记忆:const译为常量,修饰谁,不可修改谁
#include<iostream>
using namespace std;
int main()
{
//1.const修饰指针——常量指针
int a = 10;
int b = 20;
const int *p = &a;
//*p = 20;错误,不能解引用,*p的值不能修改,必须为10
p = &b;//正确,指向可以修改
//2.const修饰常量——指针常量
int * const p2 = &a;
*p2 = 100;//正确
//p2 = &b;错误,不可修改指向
//3.const修饰二者
const int * const p3 = &a;//都不可以修改
system("pause");
return 0;
}
7.6 指针和数组
作用:利用指针访问数组的元素
#include<iostream>
using namespace std;
int main()
{
//创建一个数组
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int *p = arr;//arr就是数组的首地址(数组名)
cout << "利用指针访问第一个数据 :" << *p << endl;
//利用指针打印数组
int *p2 = arr;
for (int i = 0; i < 10; i++)
{
cout << *p2<<"\t";
p2++;//p2每自加一次,就是四个字节
}
cout << endl;
system("pause");
return 0;
}
结果如下:
7.7 指针和函数
作用:利用指针做函数参数,可以修改实参
#include<iostream>
using namespace std;
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int a = 10;
int b = 20;
//地址传递,即改变的是地址,所以可以修改实参
swap(&a, &b);
cout <<"a = "<< a << endl;
cout <<"b = "<< b << endl;
system("pause");
return 0;
}
结果如下: