C++学习 指针

news2024/9/22 15:49:19

目录

指针

指针的定义和使用

指针所占用的内存空间

空指针与野指针

const修饰指针

指针和数组

指针和函数


指针

指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。

指针的定义和使用

作用:

  • 内存管理:通过指针,可以直接访问和操作内存中的数据。通过动态分配内存,使用new操作符创建对象并返回其地址,然后将地址存储在指针中,可以动态地管理内存,创建和销毁对象。

  • 传递参数:指针可用于通过引用传递参数。通过将变量的地址传递给函数,函数可以直接访问并修改变量的值,而不是传递变量的副本。这种传递方式可以避免复制大量数据,提高性能,并允许函数对原始变量进行更改。

  • 数据结构:指针在实现数据结构(如链表、树和图等)时起着重要作用。通过使用指针,可以链接不同的节点或对象,以构建复杂的数据结构,并在结构内进行遍历、插入、删除等操作。

  • 动态多态性:通过指向基类的指针,可以实现多态性。指针的多态性使得可以在运行时确定具体指向的对象类型,并调用相应的方法。这在面向对象编程中非常有用,允许以统一的方式操作和处理不同类型的对象。

  • 优化和效率:指针的使用可以提高程序的性能和效率。通过使用指针,可以减少内存和数据的复制,节省存储空间,提高数据访问速度,并允许在需要时动态分配和释放内存。

语法:

    定义:数据类型 * 变量名;

    取值:* 变量名

#include <iostream>
#include "maxValue.h"
using namespace std;

// 指针
// 定义和使用
int main()
{
    int a = 10;                           // 定义变量a
    cout << "address a : " << &a << endl; // 0x63fe14
    // 指针的定义  数据类型 * 变量名;
    int *p;
    p = &a;                              // 使用取址符号,取到a的地址赋值给指针p
    cout << "address p : " << p << endl; // 0x63fe14

    // 指针的使用 *p解除引用 找到内存中的数据
    *p = 5;                         // *p表示的是内存地址中的数据,这行代码相当于将数值5赋值给指针p指向的内存地址中的值
    cout << " a = " << a << endl;   //  a = 5 指针p指向a所在的内存地址,取到指针p对应的值并赋值为5,所以a为5
    cout << " *p = " << *p << endl; // *p = 5
    system("pause");
    return 0;
}

 

指针所占用的内存空间

指针是一种变量类型。

在32位操作系统中占用4个字节。

在34位操作系统中占用8个字节。

指针占用内存空间与操作系统相关,与指针的数据类型无关

#include <iostream>
#include "maxValue.h"
using namespace std;

// 指针
// 指针所占用的内存空间
int main()
{
    int a = 10;
    int *p = &a;
    cout << "sizeof (int *) = " << sizeof(p) << endl;         // sizeof (int *) = 8 我的操作系统是64位 如果你输出的是4可以检查一下你是否是32位操作系统
    cout << "sizeof (int *) = " << sizeof(int *) << endl;     // sizeof (int *) = 8 验证指针占用内存空间与操作系统相关,与指针的数据类型无关
    cout << "sizeof (float *) = " << sizeof(float *) << endl; // sizeof (float *) = 8
    system("pause");
    return 0;
}

 

空指针与野指针

空指针(Null Pointer):空指针是指未指向任何有效对象或内存地址的指针。在C++中,可以使用字面值 nullptr 或宏 NULL(通常定义为0)来表示空指针。空指针在以下情况下有应用:

  • 初始化指针:在声明指针变量时,可以将其初始化为空指针,表示该指针当前不指向任何有效对象。

  • 检查指针有效性:在使用指针之前,可以通过与空指针进行比较,检查指针是否有效。如果指针等于空指针,则表示指针未指向有效对象,可以进行相应的错误处理或逻辑判断。

  • 终止链表或递归:在链表或递归结构中,空指针可以用作终止条件。当指针为NULL时,表示已到达链表的末尾或递归的边界条件。

野指针(Dangling Pointer):野指针是指指针变量指向已释放或无效的内存地址。这种指针可能会导致未定义的行为和问题。野指针的应用通常是一种错误或编程失误,应该尽量避免出现。

  • 释放内存后未置空指针:如果在释放内存后没有将 指针置为空指针或重新指向其他有效的对象,那么该指针将成为野指针。

  • 悬空指针引用:在某些情况下,可能会发生指针在使用之前就失去了有效性的情况,比如函数返回栈上局部变量的指针,或者指向已经释放的内存的指针。

#include <iostream>
using namespace std;

// 指针
// 空指针
int main()
{
    // 空指针给指针变量进行初始化
    int *p = NULL;
    // *p = 1000;  出现异常。Segmentation fault
    system("pause");
    return 0;
}

#include <iostream>
using namespace std;

// 指针
// 野指针
int main()
{
    int *p = (int *)0x1100;
    cout << *p << endl; //出现异常。Segmentation fault 没有申请0x1100地址的访问权限直接访问 尽量避免
    system("pause");
    return 0;
}

const修饰指针

const修饰指针的三种情况:

  • const修饰指针:常量指针(可以修改指针指向,不可以修改指针指向的值)
  • const修饰常量:指针常量(可以修改指针指向的值,不可以修改指针指向)
  • const既修饰指针又修饰常量(不可以修改指针指向的值,不可以修改指针指向)

 

#include <iostream>

using namespace std;
// const指针

int main()
{
    // ① 常量指针(可以修改指针指向,不可以修改指针指向的值)
    int a = 10;
    int b = 20;
    const int *p = &a;
    cout << *p << endl; // 10
    p = &b;
    cout << *p << endl; // 20
    // *p = a; 报错

    // ② 指针常量(可以修改指针指向的值,不可以修改指针指向)
    int *const p2 = &a;
    *p2 = 100;
    cout << *p2 << endl; // 100
    // p2 = &b; 报错

    // ③ const既修饰指针又修饰常量(不可以修改指针指向的值,不可以修改指针指向)
    const int *const p3 = &a;
    // *p3 = 100; 报错
    // *p3 = &b; 报错
    return 0;
}

 

指针和数组

作用:使用指针访问数组中元素。

 

#include <iostream>

using namespace std;
// 指针和数组
// 使用指针访问数组
int main()
{
    int arr[5] = {1, 4, 7, 2, 5};
    int *p = arr; // 数组名arr就是第数组元素的首地址
    int size = sizeof(arr) / sizeof(arr[0]); // 数组长度计算
    for (int i = 0; i < size; i++)
    {
        cout << *p; // 14725  13与14行代码可以一起写,写成这个样子cout << *p++;
        p++;
    }

    return 0;
}

指针和函数

作用:

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

 

#include <iostream>

using namespace std;
// 指针和函数 
// 背景:我们知道值传递时是可以修改形参的值,实参是不受影响的 那么地址传递呢?

void swap01(int *p1, int *p2)
{
    int temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

int main()
{
    int a = 10, b = 20;
    swap01(&a, &b);
    cout << "a = " << a << endl; // a = 20
    cout << "b = " << b << endl; // b = 10
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/728976.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态规划:背包问题

01背包&#xff1a;物品只能选一个 完全背包&#xff1a;物品可以选无数个 注&#xff1a;01背包与完全背包&#xff0c;不论是求背包装的最多物品的价值&#xff0c;还是求装满容量为bag的背包最多有几种方法&#xff0c;区别都在里层遍历背包时&#xff0c;01背包使用倒序…

three.jsgsap滚动交互网页实现 1-模糊背景线条

实现 模型只有其中的一根线条 加载完模型后 将其圆形排列一周 要实现圆形排列一周可以自己计算sin和cos实现&#xff0c;更简单的可以使用vector3的setFromCylindricalCoords方法实现 该方法计算返回圆柱上的点&#xff0c;圆柱上的点由参数决定 使用方法&#xff1a; for (let…

监听DOM尺寸变化 - ResizeObserver

一、与 MutationObserver Api的区别 MutationObserver 主要用来监听 DOM 元素的属性和节点变化的&#xff0c;非 DOM 样式尺寸&#xff0c;可查看之前一篇 blog - DOM规范 - MutationObserver接口观察DOM元素的属性和节点变化ResizeObserver 主要用来监听 DOM 元素的 内容区域…

Stable Diffusion WebUI 不同采样方法的效果、耗时对比记录

测试方法 所有测试除了采样方法调整&#xff0c;其他均保持一致。主要参数信息如下 1girl, 3d, architecture, blurry, blurry background, blurry foreground, breasts, brown hair, building, cherry blossoms, city, cityscape, cosplay photo, cowboy shot, day, depth o…

hive2.3.7安装部署-问题:show databases;没反应

目录 一、安装包准备 二、安装mysql 三、hive安装 四、hive启动 五、问题 环境&#xff1a;CentOS7.2.xx、hadoop2.6.4、jdk1.8.0xx、mysql-5.7.38 hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射成一张表&#xff0c;并提供类SQL查询功能。…

【计算机组成原理期末课设作业】16位微型计算机实现——MOVS串传送扩展指令设计

16位微型计算机实现——MOVS串传送扩展指令设计&#x1f60e; 前言&#x1f64c;教学目的&#xff1a;1、数据**加粗样式**通路分析2、微程序控制器分析3、指令系统分析4、微程序控制器指令周期流程图5、微指令编码6、测试程序和运行结果&#xff08;1&#xff09;首先先在内存…

asp.net core 框架搭建2-搭建MVC后台管理系统

文章目录 系列文章1.项目搭建1.1 新建Asp.net core MVC项目1.2 ASP.NET Core MVC目录结构1.3 创建一个控制器&#xff0c;与页面数据交互1.4 实现一个登录页面1.5 实现后台管理主界面 2.过程中知识点和涉及到的问题2.1 session的使用2.2 EF Core连接mysql 源码下载 作者&#x…

机器学习29:《推荐系统-II》协同过滤

在《机器学习28&#xff1a;《推荐系统-I》概述》一文中&#xff0c;笔者介绍了“基于内容过滤&#xff08;content-based filtering&#xff09;”和“协同过滤&#xff08;Collaborative Filtering&#xff09;”两种常见的【候选 Item 池】生成方法。其中&#xff0c;基于内…

android studio使用Flutter Inspector调试布局

1、点击anroid studio右侧的Flutter Inspector按钮 2、点击展开布局右上角的‘Select Widget Mode’&#xff0c;即可实现点击相关节点&#xff0c;真机上可以看到相关的方框 如下图

月薪65k的大厂项目经理,是种什么体验

早上好&#xff0c;我是老原。 之前给大家更新了几期关于项目管理行业的面试题&#xff0c;又值一年毕业季&#xff0c;想入行的新手小白&#xff0c;或者想跳槽的行业大佬可以码起来了。 有很多粉丝朋友都在后台给我留言&#xff0c;想看云计算行业的岗位分析&#xff0c;今…

前端开发:JS中常用事件汇总

前言 在前端开发中&#xff0c;关于事件相关的操作是非常常见的操作&#xff0c;尤其是实际业务场景中涉及复杂交互的需求。在JS中比较常用的事件有很多&#xff0c;而且涉及不同方式不同类型的点击事件&#xff0c;一般情况下事件会和函数结合使用&#xff0c;这就是事件和函数…

Python 背包问题

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

MySQL阶段DAY20(附笔记)

【注意】&#xff1a;工厂模式学习知识结构如下&#xff1a; &#xff08;一&#xff09;、单例模式 1.Single类&#xff1a; 使用懒汉式&#xff1a;对象的延迟加载&#xff0c;安全的&#xff0c;高效的应用 双重判断提升效率和安全性 package singleton;/** 单例设计模式之…

Prisma 国内镜像设置

背景 相信大家在体验完 prisma 后&#xff0c;一般都是会感觉开发起来很方便&#xff0c;功能使用起来很顺畅很爽&#xff0c;但是想推广起来团队内使用的时候发现。。。 原因是prisma client 需要下载几个引擎&#xff0c;在其他没有翻墙工具的小伙伴使用的时候发现一直下不下…

供应商管理解决方案实战指南:打造高效供应链

在现代商业环境中&#xff0c;供应商管理是企业成功运营的关键因素之一。随着全球化和供应链的复杂性不断增加&#xff0c;供应商管理面临着许多挑战&#xff0c;如供应商选择、供应商绩效评估和供应链风险管理等。为了解决这些挑战&#xff0c;企业需要采取一系列的解决方案&a…

Sui x KuCoin Labs夏季黑客松第四批入围项目公布

自Sui x KuCoin Labs夏季黑客松开放注册以来&#xff0c;收获了众多开发者的关注和报名参与。现在比赛的报名阶段已结束&#xff0c;截至目前为止&#xff0c;我们已经公布了三批入围项目名单&#xff0c;现在第四批入围名单项目新鲜出炉&#xff0c;最后一轮入围结果将于7月12…

十、HTML中的浮动

1、浮动 1、浮动 块级元素 独占一行 若块级元素宽度较少时&#xff0c;导致后续是空白 布局 先整体&#xff0c;后局部 先简单&#xff0c;再复杂 复杂再划分 整体布局 局部 2、float属性 浮动飘 float属性 让网页元素按照标准文档流方式显示 自上到下&#xff0c;…

19.内部温度传感器

1.STM32内部温度传感器介绍&#xff1a; 内部温度传感器支持的温度范围为&#xff1a;-40~125度&#xff0c;精度为1.5℃左右&#xff1b;T(℃){(V25-Vsense)/Avg_Slope}25;STM32的内部温度传感器是直接连接在ADC内部输入通道&#xff0c;在ADC1通道16连接的内部温度传感器&am…

Django基础入门⑬:Cookie和Session详讲和Django HTML表单实战讲解

Django基础入门⑫&#xff1a;Django 对象查询详解&#xff0c;分组聚合 Cookie和SessionCookie简述Session使用Session的定义理解Session的作用 Session配置Session的基本操作Session在settings.py中的配置Cookie和Session的区别 Django HTML表单实战HTML表单实现用户的登录实…

基于混沌集成决策树的电能质量复合扰动识别(matlab代码)

目录 1 主要内容 2 部分代码 3 程序结果 4 程序链接 1 主要内容 该程序参考《基于混沌集成决策树的电能质量复合扰动识别》&#xff0c;主要做的是S变换电能质量扰动识别&#xff0c;通过S变换对电能质量扰动&#xff08;谐波&#xff0c;闪变&#xff0c;暂升等单一扰动和…