博客
关于我
C++学习日记14——指针的概念、用法及实例
阅读量:541 次
发布时间:2019-03-09

本文共 1691 字,大约阅读时间需要 5 分钟。

指针的理解与应用:从基础到实践

在C/C++编程中,指针是构建动态程序的核心工具之一,其掌握程度直接反映了程序员的技术深度。本文将从指针的基础概念出发,逐步探讨其用途和应用场景。

一、指针的基础概念

1.1 内存结构与地址

计算机内存由众多内存单元组成,每个单元都有唯一的地址(如0x1000)。内存单元储存数据,程序通过访问这些单元执行操作。

1.2 指针的定义

指针是一种特殊的变量,用于存储另一个变量的地址。在C/C++中,*符作为解引用符,&符用于取值符。例如:

int a = 10; char *p = &a; // p现在指向a的地址

这样,p可以访问a的值。

1.3 指针的特点

  • 指针本身是对象:可以进行赋值、比较、作为参数传递。
  • 无需初值:可以用undeclared变量直接赋值(如int *p;)。

2. 定义指针变量

定义格式为:

数据类型 *变量名

例如:

int *p; // p为整型指针char *c_ptr; // c_ptr为字符型指针

注意:*和&的区别。*解引用指针值,&取指针变量本身的地址。

3. 指针与变量的关系

  • 地址的表示:变量有地址,指针变量存储地址。
  • 引用与指向:通过*运算符访问指向的对象,&运算符获取地址。

4. 使用步骤

  • 定义指针变量
    int *a_ptr; // 定义一个整型指针
  • 初始化
    int num = 5; int *p = # // p指向num的地址
  • 访问
    printf("%d\n", *p); //访问指向num的值
  • 二、指针在函数中的应用

    2.1 作为参数

    通过指针实现对参数的间接传递,支持修改原变量。

    void swap(int *a, int *b) {    int temp = *a;    *a = *b;    *b = temp;}

    2.2 返回指针函数

    函数返回指针,实现灵活的数据处理。

    char *noblank(char s[]) {   int k = 0, j; //查找第一个非空格字符的位置   while (s[k] == ' ')      k++;   j = k; //将空格替换为null字符   while (s[j] != '\0') {      s[j - k] = s[j];      j++;   }   s[j - k] = '\0'; //返回去掉前导空格后的字符串指针   return s;}

    2.3 指向函数的指针

    函数名代表入口地址,通过*调用函数。

    double (*pf)(double); // pf指向平方根函数pf = sqrt; //调用sqrt函数

    三、指针与数据结构结合

    3.1 动态数组

    分配内存并动态扩展数组长度。

    int *dyn_arr = (int*)malloc(100); //动态分配内存

    3.2 链表结构

    每个节点包含数据和下一个指针。

    struct Node { int data; struct Node *next; };

    四、实例分析:示例与应用场景

    4.1 实例1:排序三个数

    通过指针实现参数的间接传递和引用传递。

    void swap(int *i, int *j) {   int temp = *i;   *i = *j;   *j = temp;}int main() {   int a = 10, b = 11, c = 2;   // ...}

    4.2 实例2:处理字符串

    清除首部空格并返回字符串。

    char *noblank(char s[]) {   // 如前所述,详细代码处理}

    4.3 实例3:函数调用

    通过函数指针灵活调用数学函数。

    double Function(double(*f)(double), double x) {   // ...}

    五、结论与总结

    指针作为C/C++的核心工具,广泛应用于参数传递、动态内存管理和数据结构开发中。在正确定义和使用情况下,指针能够显著提升程序效率和灵活性。谨慎使用,因为指针的无障碍操作可能引发错误或安全隐患。

    转载地址:http://ynzsz.baihongyu.com/

    你可能感兴趣的文章
    MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    查看>>
    MySQL8修改密码的方法
    查看>>
    Mysql8在Centos上安装后忘记root密码如何重新设置
    查看>>
    Mysql8在Windows上离线安装时忘记root密码
    查看>>
    MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
    查看>>
    mysql8的安装与卸载
    查看>>
    MySQL8,体验不一样的安装方式!
    查看>>
    MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
    查看>>
    Mysql: 对换(替换)两条记录的同一个字段值
    查看>>
    mysql:Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘解决方法
    查看>>
    MYSQL:基础——3N范式的表结构设计
    查看>>
    MYSQL:基础——触发器
    查看>>
    Mysql:连接报错“closing inbound before receiving peer‘s close_notify”
    查看>>
    mysqlbinlog报错unknown variable ‘default-character-set=utf8mb4‘
    查看>>
    mysqldump 参数--lock-tables浅析
    查看>>
    mysqldump 导出中文乱码
    查看>>
    mysqldump 导出数据库中每张表的前n条
    查看>>
    mysqldump: Got error: 1044: Access denied for user ‘xx’@’xx’ to database ‘xx’ when using LOCK TABLES
    查看>>
    Mysqldump参数大全(参数来源于mysql5.5.19源码)
    查看>>
    mysqldump备份时忽略某些表
    查看>>