C++指针(一)

文章目录

1.什么是指针?

2.普通指针的用法

3.普通指针的用处

4.指针的分类

总结


1.什么是指针?

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

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

2.普通指针的用法

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

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

以下是指针的操作方式:

1. 定义指针:在声明指针变量时,在变量名前面加上"*"符号。例如,定义一个整型指针:
 

int* p; // 声明一个整型指针p


 

2. 初始化指针:指针变量声明后,默认不指向任何变量,需要将其初始化为一个有效的内存地址。有以下两种方式可以初始化指针:
   a. 将指针指向一个已经存在的变量的地址:
  
  

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


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

 int* p = new int; // 在堆内存上分配一个整型变量的空间,并将p指向该地址


  

3. 解引用指针:使用解引用操作符"*"来获取指针所指向变量的值。例如:


 

int num = 10; // 定义一个整型变量num
int* p = # // p指向num变量的地址
int value = *p; // 解引用p,将num变量的值赋给value

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

3.普通指针的用处

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

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

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

 

int *pArray = new int[10]; // 动态分配一个包含10个整数的数组
// 使用数组...
delete[] pArray; // 释放数组空间



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

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

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

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

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

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

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

4.指针的分类

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

1. 空指针(NULL):空指针是指未指向任何有效对象或函数的指针。可以通过将指针赋值为NULL或使用初始化方式来创建一个空指针。例如,


 

int* ptr = NULL;
int* ptr = nullptr;

2. 野指针:野指针是指未初始化或指向无效内存地址的指针。使用野指针可能导致程序崩溃或产生未定义行为。避免使用野指针,可以通过初始化指针变量或赋予有效的地址来避免。

int* ptr; // 声明但未给予初始值,可能是野指针
int* ptr = new int; // 分配了一块未初始化的内存,也可能是野指针


 

3. 空悬指针(Dangling Pointer):空悬指针是指指向已经释放或无效的内存地址的指针。当释放了一块内存后,指向该内存的指针仍然存在,但该指针就成为了空悬指针。使用空悬指针可能导致程序的不可预测行为,应当避免使用。


 

int* ptr = new int;
delete ptr;
// 此时ptr成为了一个空悬指针

4. 有效指针:有效指针是指指向有效内存地址的指针。通过合法的内存分配或指向已存在的对象来创建有效指针。


 

int num = 10;
int* ptr = # // 指向num的有效指针

5. 常量指针:常量指针是指指向常量对象的指针,即指针所指向的对象是不可修改的。通过const关键字来定义常量指针。

int num = 10;
const int* ptr = # // ptr是一个指向常量int的指针,不可修改num的值


 

6. 空指针常量:空指针常量是指指向常量的空指针,不可通过指针修改所指向的对象。


 

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指向的内存空间。

完整代码如下:

#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;
}

总结

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

  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值