当前位置: 首页 > 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)

http://www.lryc.cn/news/420731.html

相关文章:

  • Vue-05.指令-v-for
  • 自动驾驶的一些大白话讲解
  • Python学习笔记--参数
  • 刷题——大数加法
  • Pytorch人体姿态骨架生成图像
  • 前端面试常考的HTML标签知识!!!
  • Oracle触发器
  • GPT-5:未来已来,我们如何共舞于智能新纪元?
  • 2024年6月 青少年机器人技术等级考试理论综合试卷(五级)
  • 【Go】 HTTP编程3-路由httprouter
  • Spring Boot 整合 SA-Token 使用详解
  • 1.3 C 语言入门实战:从 Hello World 到基础语法解析
  • 一文读懂什么是Go语言goroutine
  • 计算机毕业设计 农家乐管理平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • Spring Boot优缺点
  • Android Studio中创建apk签名文件
  • CRC32 JAVA C#实现
  • 本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——5Webscoket节点的使用
  • 深入学习小程序第二天:事件处理与用户交互
  • 操作系统快速入门(一)
  • Spring Cloud微服务性能优化:策略、实践与未来趋势
  • 秒懂C++之多态
  • C语言:求最大数不用数组
  • 零门槛成为HelpLook推荐官,邀好友加入,奖励享不停!
  • 基于python的图书馆大数据可视化分析系统设计与实现
  • 利用formdata自动序列化和xhr上传表单到后端
  • 视频号小店大地震?还好我看了原文
  • Genymotion adb shell
  • 探索AI与社交的交汇点:看Facebook如何引领智能化革命
  • JVM 加载阶段 Class对象加载位置是在 堆中还是方法区?