IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++指针的使用 -> 正文阅读

[C++知识库]C++指针的使用

一、指针的定义和使用

可以通过指针来保存一个变量的地址
例如:

int a=2;

就相当于内存中分出了一个内存块给变量a,而这个内存块中储存的数值为2;
假设这个内存块的地址为0x2e
则可以通过定义一个指针来储存这个地址0x2e

指针就是一个地址

1、定义指针

指针定义的语法:数据类型*指针变量名;

int * p;

让指针记录变量a的地址:

p=&a;//&为取地址符号
cout<<"a的地址为:"<<&a<<endl;
cout<<"指针p为:"<<p<<endl;

out:
x的地址为:0053FC70
指针p为:0053FC70

2、使用指针

可以通过解引用的方式来找到指针指向的内存;
解引用:*p
指针前加*代表解引用,找到指针指向的内存中的数据;
当然也可以直接通过*p来访问变量a的内存,并对内存中的内容做修改;

*p=1000;
cout<<"x="<<x<<endl;
cout<<"*p="<<*p<<endl;

out:
x=1000
*p=1000

二、指针所占内存空间

c++规定在32位操作系统下,不管什么类型的指针都占用4个字节的空间;
64位操作系统下,占8个字节空间。

cout << "指针p占用的空间为:" << sizeof(p) << endl;

out:
32位操作系统:指针p占用的空间为:4
64位操作系统:指针p占用的空间为:8

三、空指针和野指针

1、空指针

空指针:指针变量指向内存中编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的
当一个指针不确定指向哪的时候可以暂时指向空指针。

//1.空指针用于给指针变量进行初始化
	int * p = NULL;

	//2.空指针是不可以进行访问的
	*p = 100;
out:
输出会报错

空指针内存编号是系统占用的,因此不可访问
空指针不可访问引发权限冲突

2、野指针

野指针:指针变量指向非法的内存空间

//野指针
	//在程序中,尽量避免操纵野指针
	int * p = (int *)0x1100;
	cout << *p << endl;
out:
输出会报错

在这里插入图片描述
野指针操作的内存空间0x1100并没用经过申请,因此没有权限访问。

四、const修饰指针

const修饰指针有三种情况:

int a = 10;
int b = 10;
int *p =&a;

1.const修饰指针 - - -常量指针

在这里插入图片描述

const int * p=&a;

常量指针
特点:指针的指向可以修改,但是指针指向的值不可以修改

*p = 20;错误:指针指向的值不可以修改
p = &b; 正确:指针的指向可以修改

2.const修饰常量 - - -指针常量

在这里插入图片描述

int * const p = &a;

指针常量
特点
:指针的指向不可以改,指针指向的值可以修改

*p = 20;正确:指针指向的值可以修改
p = &b; 错误:指针的指向不可以修改

3.const即修饰指针,又修饰常量

const int * const p = &a

特点:指针的指向和指向的值都不可以修改

*p = 20;错误:指针指向的值不可修改
p = &b; 错误:指针的指向不可修改

技巧:看const右侧紧跟着的是指针还是常量,是指针就是常量指针,是常量就是指针常量

五、指针和数组

作用:利用指针访问数组元素

int numbers[10] = { 0,1,2,3,4,5,6,7,8,9 };
int * p = numbers;//numbers就是数组的首地址
for (int i = 0; i < 10; i++) {
		cout << *p << "  " << p << endl;
		p++;
	}

out:
0  003CF9C8
1  003CF9CC
2  003CF9D0
3  003CF9D4
4  003CF9D8
5  003CF9DC
6  003CF9E0
7  003CF9E4
8  003CF9E8
9  003CF9EC 

六、指针和函数

作用:利用指针做函数参数,可以修改实参的值

在值传递中,函数里面对形参的修改不可以修改函数外实参的值;
地址传递可以直接对地址进行修改,可以通过形参来修改实参。

值传递函数swap():

void swap(int num1, int num2)
{
	cout << "转换前:" << endl;
	cout << "num1=" << num1 << endl;
	cout << "num2=" << num2 << endl;
	int temp = num1;
	num1 = num2;
	num2 = temp;
	cout << endl << "转换后:" << endl;
	cout << "num1=" << num1 << endl;
	cout << "num2=" << num2 << endl;
}
int a = 2, b = 7;
swap(a, b);
cout << "a=" << a << endl;
cout << "b=" << b << endl;

out:
转换前:
num1=2
num2=7

转换后:
num1=7
num2=2
a=2
b=7

地址传递函数swap_p():

void swap_p(int *p1, int *p2)
{
	//swap(*p1,*p2);
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}
int a = 2, b = 7;
swap_p(&a, &b);//地址交换
cout << "a=" << a << endl;
cout << "b=" << b << endl;

out:
a=7
b=2

七、指针、数组、函数

利用指针对数组进行冒泡排序

打印数组的函数:

void PrintArr(int *arr, int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << " ";
	} 
	cout << endl;
}

通过Bulling_point()函数中的形参(int *arr)来将数组地址传入函数中,通过指针直接操作数组中各元素,进行冒泡排序。

void Bulling_point(int *arr, int len)//传入数组首地址和数组长度
{
	for (int i = 0; i < len-1; i++) {
		for (int j = 0; j < len-1; j++) {
			if (arr[j] > arr[j + 1]) {
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
	PrintArr(arr, len);
}

在main文件中直接调用上述函数;
而因为数组名即可代表整个数组的首地址,所以可以直接将numbers直接带入函数中的形参
(即int *arr = numbers
若此时带入形参的不是数组,而是变量,则需要取变量的地址后再代入(即int *p = &a

int numbers[10] = { 6,8,7,5,9,4,0,2,1,3 };
Bulling_point(numbers, 10);
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-19 11:41:26  更:2021-10-19 11:44:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:06:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码