详解C语言中的常量指针和指针常量

详解C语言中的常量指针和指针常量

常量指针

常量指针是指一个指针指向的内存地址不能被修改,但是它指向的内存地址所存储的值可以被修改。可以通过 const 关键字来指示这个指针是常量,例如:

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

上面的代码中,p 是一个常量指针,它指向一个整型数 a,但是不能通过 p 修改 a 的值,例如:

*p = 20;   // Error: 不能修改 *p 所指向的内存地址的值

但是可以通过其他的途径来修改 a 的值,例如:

a = 20;   // Ok: 直接修改 a 的值

指针常量

指针常量是指一个指针本身不能被修改,但是它指向的内存地址所存储的值可以被修改。可以通过 const 关键字来指示这个指针是常量,例如:

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

上面的代码中,p 是一个指针常量,它指向一个整型数 a,但是不能通过 p 修改它所指向的内存地址,例如:

p = NULL;   // Error: 不能修改 p 本身的值

但是可以通过其他的途径来修改 a 的值,例如:

*p = 20;   // Ok: 直接修改 *p 所指向的内存地址的值

示例说明

示例1:使用常量指针来实现字符串的复制

#include <stdio.h>
#include <string.h>

int main()
{
    char *src = "hello world";
    const int len = strlen(src);
    char dest[len];

    const char *pSrc = src;
    char *pDest = dest;

    while ((*pDest++ = *pSrc++) != '\0');

    printf("src=%s, dest=%s\n", src, dest);

    return 0;
}

上面的代码中使用常量指针 pSrc 来指向源字符串 src,并且将目标字符串 dest 定义为一个数组。在复制的过程中,使用 while 循环来逐个复制字符串中的字符,这里的指针是通过不停地自增来移动的。通过这种方式,我们可以避免直接修改指针的值,确保了字符串数据不被破坏。

示例2:使用指针常量来实现二分查找

#include <stdio.h>

int main()
{
    int array[] = {1, 3, 5, 7, 9, 11};
    const int len = sizeof(array) / sizeof(int);

    int num = 5;

    int *const p = array;
    int low = 0, high = len - 1, mid;

    while (low <= high) {
        mid = (low + high) / 2;
        if (p[mid] == num) {
            printf("Find %d at %d\n", num, mid);
            return 0;
        } else if (p[mid] < num) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }

    printf("Not found\n");

    return 0;
}

上面的代码中使用指针常量 p 来指向整型数组 array,并且将二分查找的过程实现为一个 while 循环。通过不停地修改 low 和 high 的值,并计算得到 mid 的值,来实现查找的过程。虽然指针常量 p 不能被修改,但是其指向的数组元素是可以被修改的,这样我们就可以动态地修改数组的值,来实现更复杂的算法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C语言中的常量指针和指针常量 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • PhpStorm 如何优雅的调试Hyperf的方法步骤

    PHPStorm 是一款功能强大的 IDE,我们可以通过它快速地进行代码编辑、调试和测试。如果我们需要开发和调试 Hyperf 应用程序,这里介绍一种优雅的调试方法。 步骤: 安装 Hyperf Debug 插件 在代码编辑器 PHPStorm 中,找到 Settings -> Plugins 进入插件管理页面,搜索 Hyperf Debug 插件并安…

    other 2023年6月27日
    00
  • mysql中迅速插入百万条测试数据的方法

    以下是在MySQL中迅速插入百万条测试数据的方法的完整攻略: 使用LOAD DATA INFILE命令批量导入数据: 准备一个包含测试数据的文本文件,每行代表一条数据。 创建一个与文本文件中数据对应的表,确保表结构与数据格式一致。 使用LOAD DATA INFILE命令将文本文件中的数据批量导入到MySQL表中。 示例说明1:使用LOAD DATA INF…

    other 2023年10月16日
    00
  • 深入了解Java虚拟机栈以及内存模型

    深入了解Java虚拟机栈以及内存模型攻略 1. Java虚拟机栈 Java虚拟机栈是Java程序运行时的一块内存区域,用于存储方法的局部变量、方法参数、返回值和操作数栈等信息。以下是Java虚拟机栈的一些重要特点: 栈帧:每个方法在运行时都会创建一个栈帧,栈帧包含了方法的局部变量表、操作数栈、动态链接、方法返回地址等信息。 线程私有:每个线程都有自己的Jav…

    other 2023年8月2日
    00
  • axios实现简单文件上传功能

    axios实现简单文件上传功能的完整攻略 在Web开发中,文件上传是一个常见的需求。axios是一个流行的JavaScript库,可以用于发送HTTP请求。本文将介绍如何使用axios实现简单的文件上传功能,并提供两个示例说明,以帮助您更好地了解和应用这些技术。 前置条件 在开始使用axios实现文件上传功能之前,您需要确保已经安装了axios库和Node.…

    other 2023年5月7日
    00
  • 移动认证亮相2018年世界移动大会-上海,护航账号认证新时代

    移动认证是一种新型的身份认证方式,主要是通过手机号码的绑定和验证来实现账号的身份认证,与传统的账号密码认证方式相比,移动认证更加便捷、安全、实时。 在2018年世界移动大会-上海,移动认证再次成为了焦点,为大家提供了全新的认证亮点和技巧。因此,在本篇攻略中,我将详细介绍移动认证的完整攻略,包含以下几个部分。 1. 移动认证的优点 移动认证相比传统账号密码认证…

    other 2023年6月26日
    00
  • JavaScript 数组常见操作技巧 (二)

    当然,下面就是详细讲解“JavaScript 数组常见操作技巧 (二)”的完整攻略。 JavaScript 数组常见操作技巧 (二) 数组过滤 filter 方法 filter() 方法用于筛选数组中满足条件的元素,返回一个新数组。它需要传入一个函数作为参数,该函数返回一个布尔值,符合条件的元素将被保留,不符合条件的将被剔除。 示例一: const arr …

    other 2023年6月25日
    00
  • mongodbjavaapi操作很全的整理

    MongoDB Java API 操作很全的整理 MongoDB是一个流行的文档数据库,其Java API可以让Java开发者轻松地与MongoDB进行交互。本文将介绍MongoDB Java API的各种操作,包括CRUD操作、索引操作、聚合操作等,帮助Java开发者更好的使用MongoDB。 环境准备 在使用MongoDB Java API之前,需要先准…

    其他 2023年3月29日
    00
  • apache php mysql开发环境安装教程

    Apache、PHP、MySQL是常见的Web开发环境,下面将会详细讲解在Windows系统上搭建这个环境的完整攻略。 安装Apache 下载Apache服务器,可以从Apache官网中下载到最新的稳定版:http://httpd.apache.org/。 运行安装包,一路默认即可,可以自定义安装目录,然后点击Install完成安装。 安装完成后,运行Apa…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部