当前位置: 首页 > news >正文

38.【C语言】指针(重难点)(C)

目录:

8.const 修饰指针

  *修饰普通变量

  *修饰指针变量

9.指针运算

  *指针+或-整数

  *指针-指针

  *指针关系运算

往期推荐

承接上篇37.【C语言】指针(重难点)(B)

8.const 修饰指针

const 全称 constant adj.不变的

*修饰普通变量

#include <stdio.h>
int main()
{const int num = 0;num = 20;printf("%d\n", num);return 0;
}

这样写会报错

说明const修饰的值不可改变

注:在C语言中,这里的num是常变量,num的本质还是变量,因为有const修饰,编译器在语法上不允许修改这个变量;而在C++语言中,这里的num就是常量

如果要强行改变,用指针

#include <stdio.h>
int main()
{const int num = 0;int* pi = &num;*pi = 2;printf("%d\n", num);return 0;
}

 

但显然已经违反常变量的语法规则,需要限制指针的行动-->const修饰指针变量

*修饰指针变量

三种写法

1.const 放在*的左边

const int* pi = &num; int const * pi = &num;

 

 语法规则:指针指向的内容不能通过指针来改变,但是指针变量本身的值是可以改

*pi=?; 错误        pi=&n;正确

2.const 放在*右边

int* const pi = &num;

语法规则: 指针指向的内容能通过指针来改变,但是指针变量本身的值是不可改

*pi=?; 正确        pi=&n;错误

3.const 放在*的左右两边

const int* const pi = &num;

语法规则:由1,2推, 指针指向的内容不能能通过指针来改变,且是指针变量本身的值是不可改

9.指针运算

*指针+或-整数

在37.【C语言】指针(重难点)(B)中已提到一些内容

练习:因为数组在内存中连续存放,所以可以用指针打印数组

#include <stdio.h>
int main()
{int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };int*  pi = &arr[0];int length=sizeof(arr)/sizeof(arr[0]);for (int i=0;i<length;i++){printf("%d ", *(pi+i));//注意pi不变}return 0;
}

*指针-指针(即地址-地址)

大地址-小地址 和 小地址-大地址 ,注意有正负

#include <stdio.h>
int main()
{int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };printf("%d",&arr[8] - &arr);return 0;
}

 

总结:当两个指针指向同一个空间时,(指针-指针)的绝对值==指针之间的元素个数

进一步思考:

 求字符串长度:

1.strlen函数

strlen(数组); 统计\0之前的元素个数

#include <stdio.h>
int main()
{char arr[] = { "asdfghjk" };size_t result=strlen(arr);printf("%d", result);return 0;
}

具体见20.5.【C语言】求长度(sizeof和strlen)的两种方式

2.用指针

未遇到\0则指针++

#include <stdio.h>
int main()
{char arr[] = { "asdfghjk" };char* pi = &arr;//&数组名就是&数组名[0]int result = 0;//可以简写成while (*pi) \0的ASCI值是0while (*pi != '\0')//未到\0则继续循环{result++;pi++;//指针移动}printf("%d", result);return 0;
}

也可以改成指针-指针

printf("%d", pi-&arr);

  *指针(大小)关系运算 

可以用来打印数组

#include <stdio.h>
int main()
{int arr[] = { 0,1,2,3,4,5,6,7,8,9 };int* pi = &arr;int sz = sizeof(arr) / sizeof(arr[0]);while (pi < &arr[sz])//&arr[sz]越界不会产生影响{printf("%d ", *pi);pi++;}return 0;
}


往期推荐:

19.【C语言】指针(重难点)(A)

37.【C语言】指针(重难点)(B)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【密码学】密码协议的安全性
  • EasyExcel 自定义转换器、自定义导出字典映射替换、满足条件内容增加样式,完整代码+详细注释说明
  • 香港网站服务器抵御恶意攻击的一些措施
  • 先进制造aps专题二十四 云平台排产aps的方案设计
  • 【实战】MFC客户端Python后端之仿造QQ聊天
  • C++初阶--命名空间、输入输出、缺省函数、函数重载、引用
  • Java设计模式(桥接模式)
  • MySQL笔记-基础篇(二):多表查询
  • XetHub 加入 Hugging Face!
  • 基于OpenMV与STM32的数据通信项目(代码开源)
  • 鸿蒙HarmonyOS开发:常用布局及实用技巧
  • MYSQL必知必会 - (一)了解sql + (二)MySQL简介
  • 《RT-DETR》论文笔记
  • 手写mybatis拦截器自动填充数据
  • Midjourney进阶-创建与管理自己的专属参数
  • .pyc 想到的一些问题
  • 2017-09-12 前端日报
  • es6
  • HTML5新特性总结
  • Java 最常见的 200+ 面试题:面试必备
  • JS+CSS实现数字滚动
  • JS基础之数据类型、对象、原型、原型链、继承
  • Laravel核心解读--Facades
  • leetcode讲解--894. All Possible Full Binary Trees
  • MySQL数据库运维之数据恢复
  • nodejs:开发并发布一个nodejs包
  • react-native 安卓真机环境搭建
  • Shadow DOM 内部构造及如何构建独立组件
  • text-decoration与color属性
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 如何用vue打造一个移动端音乐播放器
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 整理一些计算机基础知识!
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • !!java web学习笔记(一到五)
  • #162 (Div. 2)
  • #android不同版本废弃api,新api。
  • $GOPATH/go.mod exists but should not goland
  • (11)MSP430F5529 定时器B
  • (LLM) 很笨
  • (pycharm)安装python库函数Matplotlib步骤
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (数据结构)顺序表的定义
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .Family_物联网
  • .gitignore文件---让git自动忽略指定文件
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .net 无限分类
  • .NET设计模式(8):适配器模式(Adapter Pattern)