C++指针(一)

文章目录

1.什么是指针?

2.普通指针的用法

3.普通指针的用处

4.指针的分类

总结


1.什么是指针?

在C++编程中,指针是一种特殊的变量,它存储的是另一个变量的内存地址,而不是像普通变量那样存储具体的数值或数据。通过指针,程序员可以直接访问和操作内存中特定位置的数据。

具体来说,指针变量的值是一个内存地址,该地址指向程序数据存储区域中的一个数据对象(如整数、字符、数组、结构体、函数等)。当你对一个指针解引用(使用 `*` 运算符)时,就可以访问它所指向的内存位置上的值。

2.普通指针的用法

指针在C++中的具体用法相当丰富,以下是一些常见的指针操作和用法:

指针是用来存储变量内存地址的变量。它可以指向不同类型的变量,例如整型、字符型、浮点型等。指针可以通过操作符"*"来解引用,即获取指针指向的变量的值。

以下是指针的操作方式:

  1. 定义指针:在声明指针变量时,在变量名前面加上"*"符号。例如,定义一个整型指针:
cpp 复制代码
int* p; // 声明一个整型指针p
  1. 初始化指针:指针变量声明后,默认不指向任何变量,需要将其初始化为一个有效的内存地址。有以下两种方式可以初始化指针:

a. 将指针指向一个已经存在的变量的地址:

cpp 复制代码
 int num = 10; // 定义一个整型变量num
   int* p = # // p指向num变量的地址

b. 使用new关键字在堆内存上分配一块新的内存,并将指针指向该内存地址:

cpp 复制代码
 int* p = new int; // 在堆内存上分配一个整型变量的空间,并将p指向该地址
  1. 解引用指针:使用解引用操作符"*"来获取指针所指向变量的值。例如:
cpp 复制代码
int num = 10; // 定义一个整型变量num
int* p = # // p指向num变量的地址
int value = *p; // 解引用p,将num变量的值赋给value

需要注意的是,操作指针时应当确保指针指向的内存地址是有效的,避免出现野指针的问题。同时,在使用完指针后,也应当进行内存释放,避免内存泄漏现象的发生。

3.普通指针的用处

指针在C++中扮演着极其重要的角色,它的主要用途包括但不限于以下几点:

  1. 内存寻址:

指针允许直接操作内存地址,可以定位和访问内存中任意位置的数据。通过指针,你可以直接读取或修改位于特定内存地址处的值,这是C++中最底层的数据操作方式之一。

  1. 动态内存管理:

使用指针配合new和delete操作符可以动态地分配和释放内存空间,创建在编译时大小未知的对象或数组。例如,你可以根据运行时的需要创建一个新的整数数组:

cpp 复制代码
int *pArray = new int[10]; // 动态分配一个包含10个整数的数组
// 使用数组...
delete[] pArray; // 释放数组空间
  1. 数据结构实现:

在实现链表、树、图等复杂数据结构时,节点之间通常通过指针相连,形成灵活的链接关系。指针使得数据结构可以根据需要扩展和收缩,实现高效的插入、删除和搜索操作。

  1. 函数参数传递:

指针可以用来传递大型数据结构的地址,代替复制整个数据结构,从而节省内存和提高效率。通过指针传递参数,还能实现实现数据的"传址"而非"传值"。

  1. 函数指针:

函数指针可以存储函数的地址,通过函数指针可以实现函数回调、策略模式等功能,使得程序设计更加灵活。

  1. 数组操作:

指针可以用来遍历数组,因为数组的名称本质上就是一个指向数组首元素的指针。通过递增或递减指针,可以顺序访问数组中的每一个元素。

  1. 结构体和类成员访问:

在C++中,this指针指向当前对象的内存地址,通过this可以方便地访问类的成员变量和成员函数。

  1. 效率优化:

在某些情况下,使用指针代替拷贝操作可以提高程序性能,尤其是在处理大量数据时,直接操作指针指向的内存比频繁复制数据更有效率。

综上所述,指针是C++编程中不可或缺的一部分,它为开发者提供了对内存和数据操作的强大控制能力,但同时也要求更高的编程技巧和对内存管理的深刻理解。

4.指针的分类

指针的分类主要有以下几种:

  1. 空指针(NULL):空指针是指未指向任何有效对象或函数的指针。可以通过将指针赋值为NULL或使用初始化方式来创建一个空指针。例如,
cpp 复制代码
int* ptr = NULL;
int* ptr = nullptr;
  1. 野指针:野指针是指未初始化或指向无效内存地址的指针。使用野指针可能导致程序崩溃或产生未定义行为。避免使用野指针,可以通过初始化指针变量或赋予有效的地址来避免。
cpp 复制代码
int* ptr; // 声明但未给予初始值,可能是野指针
int* ptr = new int; // 分配了一块未初始化的内存,也可能是野指针
  1. 空悬指针(Dangling Pointer):空悬指针是指指向已经释放或无效的内存地址的指针。当释放了一块内存后,指向该内存的指针仍然存在,但该指针就成为了空悬指针。使用空悬指针可能导致程序的不可预测行为,应当避免使用。
cpp 复制代码
int* ptr = new int;
delete ptr;
// 此时ptr成为了一个空悬指针
  1. 有效指针:有效指针是指指向有效内存地址的指针。通过合法的内存分配或指向已存在的对象来创建有效指针。
cpp 复制代码
int num = 10;
int* ptr = # // 指向num的有效指针
  1. 常量指针:常量指针是指指向常量对象的指针,即指针所指向的对象是不可修改的。通过const关键字来定义常量指针。
cpp 复制代码
int num = 10;
const int* ptr = # // ptr是一个指向常量int的指针,不可修改num的值
  1. 空指针常量:空指针常量是指指向常量的空指针,不可通过指针修改所指向的对象。
cpp 复制代码
const int* ptr = nullptr; // ptr是一个指向常量int的空指针

这些是指针的主要分类,了解它们的特性和使用方法非常重要,可以在编程中避免一些常见的错误和问题。

5.普通指针的练习

题目:实现一个程序,要求使用普通指针变量实现以下功能:

  1. 输入一个整数n,创建一个长度为n的整型数组;

  2. 输入n个整数,将这些整数存储到数组中;

  3. 输出数组中的所有元素;

  4. 计算数组中的最大值和最小值,并输出;

  5. 释放数组内存。

知识点:动态分配内存,指针的使用。

步骤:

  1. 声明一个指针变量int* arr,并将其初始化为NULL;

  2. 输入一个整数n;

  3. 使用动态内存分配函数malloc为数组分配内存空间,将返回的地址赋值给arr;

  4. 使用循环,输入n个整数并存储到数组中;

  5. 使用循环,输出数组中的所有元素;

  6. 使用循环,计算数组中的最大值和最小值;

  7. 输出最大值和最小值;

  8. 释放arr指向的内存空间。

完整代码如下:

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

int main() {
    int* arr = NULL;
    int n, i;
    int max, min;

    printf("请输入数组的长度:");
    scanf("%d", &n);

    // 动态内存分配
    arr = (int*)malloc(n * sizeof(int));

    printf("请输入%d个整数:\n", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    printf("数组中的元素为:\n");
    for (i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    // 计算最大值和最小值
    max = min = arr[0];
    for (i = 1; i < n; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
        if (arr[i] < min) {
            min = arr[i];
        }
    }

    printf("数组的最大值为%d,最小值为%d。\n", max, min);

    // 释放内存
    free(arr);

    return 0;
}

总结

本篇博客到这里就结束了,感谢大家的支持与观看,如果有好的建议欢迎留言,谢谢大家啦!

相关推荐
天若有情6732 小时前
IoC不止Spring!求同vs存异,两种反向IoC的核心逻辑
java·c++·后端·算法·spring·架构·ioc
tankeven2 小时前
HJ103 Redraiment的走法
c++·算法
模型时代2 小时前
Arista暗示正在开发AI网络管理遥测工具
开发语言·人工智能·php
张3蜂2 小时前
Python变量与命名规范:从入门到精通
开发语言·python
瓦特what?2 小时前
平 滑 排 序
c++·算法·排序算法
电商API_180079052472 小时前
京东商品评论API接口封装的心路历程
服务器·开发语言·爬虫·数据分析·php
扶尔魔ocy2 小时前
【转载】QT使用linuxdeployqt打包
开发语言·qt
Trouvaille ~3 小时前
【动态规划篇】专题(二):路径问题——在网格图中的决策艺术
c++·算法·leetcode·青少年编程·动态规划
好家伙VCC3 小时前
# 发散创新:基于Python的TTS语音合成实战与优化策略 在人工智能加速落地的今天,**文本转
java·开发语言·人工智能·python