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

server/2024/9/23 2:46:26/

目录

  • 一、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; //errorp = 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.ppmy.cn/server/25474.html

相关文章

VUE+TS使用elementUI的el-checkbox双重v-for循环做勾选

html部分 <template><div class"hello"><el-form :model"elForm"> <!-- cities对象数组形式 --><el-form-item v-for"(item, topIndex) in cities" :key"topIndex"> <!--item.checked 是每一个item…

利用Wget批量下载网页链接中的数据

1、电脑下载安装好Wget程序&#xff0c;具体操作流程可参照&#xff1a; wget 的安装与使用&#xff08;Windows&#xff09;_wget windows-CSDN博客https://blog.csdn.net/m0_45447650/article/details/125786723?ops_request_misc%257B%2522request%255Fid%2522%253A%25221…

经典网络解读——EfficientnetV2

论文&#xff1a;EfficientNetV2: Smaller Models and Faster Training&#xff08;2021.4&#xff09; 作者&#xff1a;Mingxing Tan, Quoc V. Le 链接&#xff1a;https://arxiv.org/abs/2104.00298 代码&#xff1a;https://github.com/google/automl/tree/master/efficien…

JVM (Micrometer)监控SpringBoot(AWS EKS版)

问题 怎样使用JVM (Micrometer)面板&#xff0c;监控Spring&#xff1f;这里不涉及Prometheus和Grafana&#xff0c;重点介绍与Micrometer与Springboot&#xff0c;k8s怎样集成。 pom.xml 引入依赖&#xff0c;如下&#xff1a; <properties><micrometer.version&…

西门子:HMI小游戏-灰太狼与喜羊羊

DB块&#xff1a; HMI界面&#xff1a; 实际视频&#xff1a; 抓羊小游戏

Visual 下载 NuGet包速度变慢

Visual 下载 NuGet包速度变慢 最近遇到一个问题&#xff0c;即我在使用 Visual Studio 下载 Nuget 包的时候会发现变得特别慢&#xff0c;那么该如何解决该问题呢 Visual Studio → 工具 → NuGet 包管理项 → 程序包管理设置 → 程序包源 从上面我们可以看到我使用的包源地址…

关于apache+php用户验证

一.直接在apache配置配置用户信息 1.apache配置可以参考外部文档 https://developer.aliyun.com/article/507049 2.上面配置好在php获取用户信息&#xff08;登录apache会拦截&#xff09; $userName $_SERVER[PHP_AUTH_USER];$password $_SERVER[PHP_AUTH_PW]; 二.上面直…

计算机常识 | 快速格式化、擦除格式化、覆盖格式化 | 直连电脑可相互ping通

文章目录 一、快速格式化、擦除格式化、覆盖格式化二、两台没有联网的设备通过网线直接相连能够相互ping通的原因 一、快速格式化、擦除格式化、覆盖格式化 快速格式化、擦除格式化和覆盖格式化是针对计算机存储设备&#xff08;如硬盘驱动器或固态硬盘&#xff09;上数据删除和…