C++学习之旅(十二) 指针

学习资料及工具:bilibili视频网站黑马程序员匠心之作,BV1et411b73Z,共大概300+集https://www.bilibili.com/video/BV1et411b73Z?p=2

工具:Visual 2015

虽然不是0基础,但是之前感觉之前学过的和没学过一样,所以用0基础视频进行学习,此系列帖子作为笔记使用(主要是字丑)。


目录

正文

7 指针

7.1 指针的基本概念

7.2 指针变量的定义和使用

7.3 指针所占用的内存空间

         7.4 空指针和野指针

7.5 const修饰指针

 7.6 指针和数组

7.7 指针和函数


正文

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修饰指针一般三种情况:

  1. const修饰指针——常量指针(指针指向可以修改,但值不可修改)
  2. const修饰常量——指针常量(指向不可以改,但值可以改)
  3. 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;
}

结果如下:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值