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

yizhihongxing

详解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日

相关文章

  • 无法将函数定义与现有的声明匹配 问题的解决办法 分享

    问题描述:当我们在编写程序的时候,可能会遇见“无法将函数定义与现有的声明匹配”这个错误,这种情况通常发生在我们在使用函数前未正确声明函数的情况下。 解决办法:要解决这个问题,我们需要做两件事:一是声明函数,二是定义函数。 声明函数 在程序中,声明函数是很重要的,它可以告诉编译器我们程序中有哪些函数,并定义这些函数的参数和返回值类型。 例如,如果我们要在程序中…

    other 2023年6月26日
    00
  • linux中memset的正确用法

    以下是关于Linux中memset函数的正确用法的详细攻略: memset函数简介 memset函数是C语言中的一个函数,用于将一段存空间设置为指定的值。在Linux,memset函数通常用于初始化内存间或清除内存空间。 memset函数的原型如下: void *(void *s, int c, size_t n); 其中,s 是指向要设置的内存空间的指针,…

    other 2023年5月7日
    00
  • C语言菜鸟基础教程之数据类型

    C语言菜鸟基础教程之数据类型 数据类型概述 在C语言中,数据类型是不可避免的概念。在C语言中,常用的数据类型包括基本数据类型和派生数据类型。其中,基本数据类型指的是C语言自带的数据类型,包括浮点型、整型和字符类型,而派生数据类型则是由基本数据类型通过特定方式派生得出的数据类型。 基本数据类型 整型 整型是C语言中最常用的数据类型之一,指的是带有符号或无符号的…

    other 2023年6月27日
    00
  • bigdecimal创建初始化值类型对比

    Bigdecimal创建初始化值类型对比 简介 BigDecimal 是 Java 中一个用于精确计算的类,对于一些对计算精度要求比较高的场合,例如金(融)业务计算,非常有用。在 BigDecimal 类中,可以使用字符串、double、int 等多种类型来初始化一个 BigDecimal 对象,性能和精度也不同。本文将对比不同的初始化方式带来的性能和精度影…

    其他 2023年3月28日
    00
  • Android Drawable代码编写的新姿势分享

    这里是完整的Android Drawable代码编写的新姿势的攻略。 什么是Android Drawable? 在Android中,Drawable是一个用于定义可绘制的图形对象的抽象类。Drawable可以用作背景、图标等UI元素,它提供了各种绘制操作。Android中的Drawable大致可以分为以下几类: BitmapDrawable(bitmap) …

    other 2023年6月26日
    00
  • JavaScript与Image加载事件(onload)、加载状态(complete)

    JavaScript中,Image加载事件(onload)和加载状态(complete)是用于加载图片并获取图片的加载状态的两种常用方法。下面我们对它们进行详细讲解。 加载事件 (onload) 使用 Image 对象加载图片时,需要使用 onload 事件来检测图片是否被加载。当图片加载完成时,将出发 onload 事件。要使用 onload 事件,需要定…

    other 2023年6月25日
    00
  • 荣耀50pro开发者选项如何开启?荣耀50pro打开开发者选项的方法

    荣耀50pro的开发者选项可以通过以下简单步骤来进行开启: 1. 打开“设置”应用 在荣耀50pro的主屏幕上,点击图标为“设置”的应用,打开设备的系统设置。 2. 进入设备信息页面 在“设置”应用主页中,向下滚动直至找到“关于手机”选项,点击进入。 3. 点击版本号 在“关于手机”页面中找到“版本号”选项,并持续点击此选项,直至屏幕上显示“您已成为开发者”…

    other 2023年6月26日
    00
  • 详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现

    当然!下面是关于\”详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现\”的完整攻略,包含两个示例说明。 … … … … … … … … … … … … … … … … … … … … … … … … … … … ..…

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