再回顾const int* p, int const* p,int* const p 的区别

news2025/1/13 13:39:17

目录

  • 一、const int* p 和 int const* p (常量指针)
    • 1.1 p 指向的内存不能通过指针p 修改
    • 1.2 其他指针可以修改p 指向的内存
    • 1.3 指针p 可以重新指向其他地址
  • 二、int* const p (指针常量)
    • 2.1 p 定义的时候初始化
    • 2.2 p 定义的时候未初始化
    • 2.3 可以通过 p 修改指向内存存放的值
  • 三、const int * const p

一、const int* p 和 int const* p (常量指针)

const int* p int const* p 两者都是一样,表示的都是p 指向的是内容不能通过指针p 去修改。 注意:这里不表示p 指向的区域不能被修改,如果一个 int * p2 指针也指向同一个区域,可以通过p2 指针修改这个区域的内容。
在这里插入图片描述

1.1 p 指向的内存不能通过指针p 修改

void test_1_func( void )
{
    int buf_1[5] = {1, 2, 3, 4, 5};
    const int *p = buf_1;
    int *p1 = buf_1;

    p[0] = 8;

}

编译上述代码,编译器提示:

main.c: In function ‘test_1_func’:
main.c:10:10: error: assignment of read-only location ‘*p’
   10 |     p[0] = 8;
      |   

1.2 其他指针可以修改p 指向的内存

void test_1_func( void )
{
    int buf_1[5] = {1, 2, 3, 4, 5};
    const int *p = buf_1;
    int *p1 = buf_1;
    int i = 0;

    p1[0] = 8;
    printf( "print buf_1:\n" );
    for ( i = 0; i < sizeof( buf_1 ) / sizeof( buf_1[0] ); i++ )
        printf( "%d,", p[i] );
    printf( "\n" );

}

代码执行结果如下:

第一个元素已经被修改成8。

print buf_1:
8,2,3,4,5,

1.3 指针p 可以重新指向其他地址

void test_2_func( void )
{
    int buf_1[5] = {1, 2, 3, 4, 5};
    int buf_2[5] = {11, 12, 13, 14, 15};
    int i = 0;
    const int *p = buf_1;

    printf( "p pointer to buf_1:\n" );
    for ( i = 0; i < sizeof( buf_1 ) / sizeof( buf_1[0] ); i++ )
        printf( "%d,", p[i] );
    printf( "\n" );

    p = buf_2;
    printf( "p pointer to buf_2:\n" );
    for ( i = 0; i < sizeof( buf_2 ) / sizeof( buf_2[0] ); i++ )
        printf( "%d,", p[i] );
    printf( "\n" );

}

代码执行结果如下:

p pointer to buf_1:
1,2,3,4,5,
p pointer to buf_2:
11,12,13,14,15,

二、int* const p (指针常量)

int* const p const 修饰的是指针p,表示p 只能指向一个地址,并且是在定义p 的时候指向该地址,中途不能指向其他地址。

2.1 p 定义的时候初始化

void test_3_func( void )
{
    int buf_1[5] = {1, 2, 3, 4, 5};
    int *const p = buf_1 ;
    printf( "p pointer to buf_1:\n" );
    for ( int i = 0; i < sizeof( buf_1 ) / sizeof( buf_1[0] ); i++ )
        printf( "%d,", p[i] );
    printf( "\n" );
}

代码编译,运行结果如下:

p pointer to buf_1:
1,2,3,4,5,

2.2 p 定义的时候未初始化

void test_3_func( void )
{
    int buf_1[5] = {1, 2, 3, 4, 5};
    int *const p = NULL;
    p = buf_1;
}

编译结果如下:

main.c: In function ‘test_3_func’:
main.c:43:7: error: assignment of read-only variable ‘p’
   43 |     p = buf_1;
      |    

2.3 可以通过 p 修改指向内存存放的值

void test_3_func( void )
{
    int buf_1[5] = {1, 2, 3, 4, 5};
    int *const p = buf_1;

    p[0] = 6;
    p[1] = 7;

    printf( "p pointer to buf_1:\n" );
    for (int i = 0; i < sizeof( buf_1 ) / sizeof( buf_1[0] ); i++ )
        printf( "%d,", p[i] );
    printf( "\n" );
}

程序运行结果如下:

p pointer to buf_1:
6,7,3,4,5,

三、const int * const p

结合前面的介绍,可以知道:

  • p 指向的内容不能通过p 进行修改
  • p 指针也只能指向一个地址,不能修改
void test_4_func(void)
{
    int buf_1[5] = {1, 2, 3, 4, 5};
    int buf_2[5] = {11, 12, 13, 14, 15};
    const int * const p = buf_1;
    p[0] = 6; //error
    p = buf_2; //error

}

代码编译结果如下:

main.c: In function ‘test_4_func’:
main.c:58:10: error: assignment of read-only location ‘*p’
   58 |     p[0] = 6;
      |          ^
main.c:59:7: error: assignment of read-only variable ‘p’
   59 |     p = buf_2;
      |   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1635392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Adobe推出AI视频超分辨率工具VideoGigaGAN

&#x1f989; AI新闻 &#x1f680; Adobe推出AI视频超分辨率工具VideoGigaGAN 摘要&#xff1a;Adobe公司最新推出的AI工具VideoGigaGAN&#xff0c;利用上采样技术将视频分辨率从128128提升至10241024。这一工具基于GigaGAN模型开发&#xff0c;专注于生成视频超分辨率&am…

利用大型语言模型提升个性化推荐的异构知识融合方法

在推荐系统中&#xff0c;分析和挖掘用户行为是至关重要的&#xff0c;尤其是在美团外卖这样的平台上&#xff0c;用户行为表现出多样性&#xff0c;包括不同的行为主体&#xff08;如商家和产品&#xff09;、内容&#xff08;如曝光、点击和订单&#xff09;和场景&#xff0…

前端性能优化知识梳理

1.重要性 当我们面试的时候&#xff0c;前端性能优化方面算是必考的知识点&#xff0c;但是工作中我们又很少会重点的对项目进行前端优化&#xff0c;它真的不重要吗&#xff1f; 如果我们可以将后端响应时间缩短一半&#xff0c;整体响应时间只能减少5%~10%。而如果关注前端…

自动化神器,获客秘籍揭秘!

在如今这个信息爆炸的时代&#xff0c;企业如何高效精准地获客成为了一个重要课题。传统的营销方式不仅成本高昂&#xff0c;且效果往往难以衡量。然而&#xff0c;随着自动化工具的兴起&#xff0c;这一切都在悄无声息中发生着翻天覆地的变化。 我们得了解一下什么是自动化工具…

【ZYNQ】Zynq 开发流程

Zynq 芯片架构由嵌入式处理器&#xff08;Processing System, PS&#xff09;与可编程逻辑&#xff08;Programmable Logic, PL&#xff09;&#xff0c;以及 PS 与 PL 之间的互联总线组成。本文主要介绍 Xilinx Zynq 芯片开发所使用的软件&#xff0c;包括 Vivado IDE 与 Xili…

2024最新的,免费的 ChatGPT 网站AI(八个)

ChatGPT是美国人工智能研究实验室OpenAI在2022年11月推出的一款人工智能技术驱动的语言模型应用。它基于GPT-3.5架构&#xff08;后续还有GPT-4架构的升级版&#xff09;构建&#xff0c;拥有强大的自然语言处理能力和上下文理解能力&#xff0c;能够参与多轮对话&#xff0c;为…

C语言中的趣味代码(五)

我想以此篇结束关于C语言的博客&#xff0c;因为在C语言拖得越久越不能给大家带来新的创作&#xff0c;在此我也相信大家对C语言已经有了一个新的认知。进入正题&#xff0c;在这一篇中我主要编一个“英语单词练习小程序”来给大家展开介绍&#xff0c;从测试版逐步改良&#x…

C语言入门课程学习笔记-7

C语言入门课程学习笔记-7 第31课 - 初探程序中的函数实验-函数调用实验-函数求前n个正整数和 第32课 - 深入浅出函数调用第33课 - 函数定义细节剖析实验-返回int实验-返回void 第34课 - 函数参数深度剖析实验-形参实参实验-数组元素作为函数形参小结 第35课 - 编写函数对数组排…

前端: 浏览器调试小技巧

1. 如何禁止某个网站跳转: 用于拦截网站地址 2. 如何在线上环境调试源代码, 给源代码打断点 3. 如何在线编写代码 线上调试代码: network -> 找到加载的html文件 -> 右击 -> 选择override content (浏览器的代理调试程序) -> 可以在线写代码啦 4. 如何通过浏览器…

电脑提示msvcr110.dll文件丢失的常见问题以及解决方案

在使用电脑时突然提示msvcr110.dll文件丢失的问题&#xff0c;这是一个的常见问题接下俩这篇文章将教大家几种以及msvcr110.dll丢失的解决方案&#xff0c;用户可能会遇到一些常见问题&#xff0c;这些问题可能会影响他们的软件运行或系统稳定性。以下是一些常见问题及其解决方…

R语言的学习——day1

将数据框中某一列数据改成行名 代码 结果

可平滑替代FTP的FTP替代解决方案,具有哪些强大功能?

FTP是一种广泛使用的文件传输协议&#xff0c;主要用于在网络上的计算机之间传输文件。具有以下特点&#xff1a; 1.简单易用&#xff1a;FTP协议相对简单&#xff0c;易于设置和使用&#xff0c;许多操作系统和应用程序都内置了对FTP的支持。 2.广泛的客户端支持&#xff1a…

C++三大特性及应用

C三大特性 面向对象程序设计&#xff08;OOP&#xff09;是一种编程范式&#xff0c;它使用“对象”来设计软件。在OOP中&#xff0c;对象是类的实例&#xff0c;类包含数据&#xff08;属性&#xff09;和可以对数据执行操作的方法&#xff08;行为&#xff09;。 面向对象的…

Ieetcode——21.合并两个有序链表

21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 合并两个有序链表我们的思路是创建一个新链表&#xff0c;然后遍历已知的两个有序链表&#xff0c;并比较其节点的val值&#xff0c;将小的尾插到新链表中&#xff0c;然后继续遍历&#xff0c;直到将该两个链表…

请求路径引发的http308错误

记录一个请求路径输错引发的问题。 正确路径&#xff1a; /user/bind-email 请求路径我们如果输错故意多打一个s /user/bind-emails 正常预检请求会报错404未找到&#xff0c;我们下意识的就去排查路径是不是写错了 但是如果多打一个/ /user//bind-email 此时预检请求会报308永…

【iOS】消息流程分析

文章目录 前言动态类型动态绑定动态语言消息发送objc_msgSendSEL&#xff08;selector&#xff09;IMP&#xff08;implementation&#xff09;IMP高级用法 MethodSEL、IMP、Method总结流程概述 快速查找消息发送快速查找的总结buckets 慢速查找动态方法解析resolveInstanceMet…

做国外数据采集,更改ip后还被封是ip质量的原因吗?

IP质量低确实会出现封锁情况&#xff0c;但不是唯一的因素。 高质量的IP地址通常不容易被锁定&#xff0c;因为他们往往是由正规的ISP&#xff08;互联网服务商&#xff09;。但是&#xff0c;即使是高质量的IP地址&#xff0c;也有可能受其他因素影响导致封锁&#xff0c;如滥…

详解封装,继承,多态

java是一种面向对象的编程语言。 面向对象&#xff1a;是把构成问题的事务分解成各个对象&#xff0c;而建立对象的目的也不是为了完成一个个步骤&#xff0c;而是为了描述某个事物在解决整个问题的过程中所发生的行为。面向对象有封装、继承、多态的特性&#xff0c;所以易维…

肝了半年,我整理出了这篇云计算学习路线(新手必备,从入门到精通)

大家好&#xff01;我是凯哥&#xff0c;今天给大家分享一下云计算学习路线图。这是我按照自己最开始学习云计算的时候的学习路线&#xff0c;并且结合自己从业多年所涉及的知识精心总结的云计算的思维导图。这是凯哥精心总结的&#xff0c;花费了不少精力哦&#xff0c;希望对…