C 深入指针(1)

目录

一、const

1、const修饰变量

2、const修饰指针

2.1 const int* p(int const* p)

2.2 int* const p

2.3 结论

二、指针运算

1、指针 +- 整数

2、指针 - 指针

3、指针的关系运算

三、指针的使用

1、模拟实现 strlen

2、传值调用和传址调用


一、const

1、const修饰变量

通过上图的报错信息可知,被const修饰的变量无法别修改,那我们试试通过地址修改他

#include<stdio.h>
int main()
{const int n = 10;int* p = &n;    *p = 20;printf("%d", n);    //成功输出20!return 0;
}

还真可以,这让我想到那些红客哈哈好厉害。

在这里我们明明不想n被改变,结果通过指针给n改了,这是不合理的!那该怎么办呢?


2、const修饰指针

2.1 const int* p(int const* p)

在 * 左边加上const可以看到,*p 无法被修改了

int const* p = &n;    //和 const int* p 等价

2.2 int* const p

那指针内的地址能修改吗

可以看到地址能被修改,指针变量 p 存放的本来是 n 的地址,输出应该是10,结果输出100;说明 p 存放的地址被改成了 m 的地址;地址不想被修改怎么办?

在 * 右边加上const可以看到,p 无法被修改了


2.3 结论

const 如果放在 * 的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。 但是指针变量本身的内容可变。

const 如果放在 * 的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指 向的内容,可以通过指针改变。  

如果都不想被修改,左右都加上const就好啦

const int* const p = &n;int const* const p = &n


二、指针运算

指针的基本运算有三种,分别是:

  • 指针 +- 整数
  • 指针 - 指针
  • 指针的关系运算

1、指针 +- 整数

#include<stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = arr;//依次打印数组内容for (int i = 0; i < 10; i++){//printf("%d ", arr[i]);printf("%d ", *(p + i));	//指针+整数	}return 0;
}

2、指针 - 指针

#include<stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p1 = arr;		//指向数组第一个元素int* p2 = arr + 9;	//指向数组最后一个元素//输出的是字符串的长度,9printf("%zd", p2 - p1);return 0;
}

3、指针的关系运算

#include<stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p1 = arr;		//指向数组第一个元素int* p2 = arr + 9;	//指向数组最后一个元素//依次打印数组元素while (p1 <= p2)    //关系运算{printf("%d ", *p1);p1++;}return 0;
}

三、指针的使用

1、模拟实现 strlen

库函数strlen的功能是求字符串长度,统计的是字符串中 \0 之前的字符的个数。

#include<stdio.h>
#include<string.h>	//使用strlen时必须声明的头文件
int main()
{char arr[] = "abcd";size_t length = strlen(arr);printf("%zd", length);	//输出 4return 0;
}

通过使用指针来模拟实现 strlen函数:

#include<stdio.h>
int my_strlen(const char* p)
{int count = 0;while (*p)	//遍历到末尾的 \0 就会终止循环{count++;p++;}return count;
}
int main()
{char arr[] = "abcdef";int length = my_strlen(arr);	//模拟strlenprintf("%d", length);return 0;
}

2、传值调用和传址调用

我们通过写一个交换值的函数来告诉这两者的区别

#include<stdio.h>
//传值调用
void swap(int x, int y)	//x = a; y = b
{int tmp = x;x = y;y = tmp;
}
int main()
{int a = 1;int b = 100;printf("交换前:a = %d b = %d\n", a, b);swap(a, b);	//想实现交换两个变量的值printf("交换后:a = %d b = %d", a, b);return 0;
}

运行之后发现 a 和 b 的值根本没有改变,这是为什么,启动调试监测

不清楚为什么是栈区可以看初阶 C语言的变量和算术操作符-CSDN博客

结论:实参传递给形参的时候,形参会单独创建一份临时空间来接收实参,对形参的修改不影响实参。 所以 swap() 失败了。 

所以我们需要传址调用

#include<stdio.h>
//传址调用
void swap(int* x, int* y)	//x = &a; y = &b
{int tmp = *x;*x = *y;*y = tmp;
}
int main()
{int a = 1;int b = 100;printf("交换前:a = %d b = %d\n", a, b);swap(&a, &b);	//实现交换两个变量的值printf("交换后:a = %d b = %d", a, b);return 0;
}

这次就成功交换了,这里调用 swap函数 的时候是将变量的地址传递给了函数,这种函数调用方式叫:传址调用

传址调用,可以让函数和主调函数之间建立真正的联系,在函数内部可以修改 main函数 中的变量;所以未来函数中只是需要 main函数 中的变量值来实现计算,就可以采用传值调用。如果函数内部要修改 main函数 中的变量的值,就需要传址调用。


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ContEA阅读笔记

Facing Changes: Continual Entity Alignment for Growing Knowledge Graphs 面对变化&#xff1a;不断增长的知识图谱的持续实体对齐 Abstract 实体对齐是知识图谱(KG)集成中一项基本且重要的技术。多年来&#xff0c;实体对齐的研究一直基于知识图谱是静态的假设&#xff…

wlan二层旁挂组网实验

实验拓扑图 代码&#xff1a; SW1 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sysn sw1 [sw1]undo info-center enable Info: Information center is disabled. [sw1]vlan batch 10 20 30 Info: This operation may take a few seconds. …

SpringCloud Alibaba Sentinel 修改Dashboard用户名和密码

目录 一、下载Sentinel的Jar包 二、在启动时修改用户名和密码的命令 三、测试登录成功 在网上找到了一大堆文章&#xff0c;没一个有用的&#xff0c;最终还是通过不断测试找到了这个方法。 一、下载Sentinel的Jar包 Releases alibaba/Sentinel GitHub 二、在启动时修改…

【网络安全产品】---应用防火墙(WAF)

what Web应用防火墙&#xff08;Web Application Firewall) WAF可对网站或者App的业务流量进行恶意特征识别及防护&#xff0c;在对流量清洗和过滤后&#xff0c;将正常、安全的流量返回给服务器&#xff0c;避免网站服务器被恶意入侵导致性能异常等问题&#xff0c;从而保障…

视频降噪算法 hqdn3d 原理分析

视频降噪 视频降噪是一种处理技术&#xff0c;旨在减少视频中的噪声&#xff0c;提高画面质量。噪声可能来自多种源头&#xff0c;包括摄像机的传感器、压缩算法、传输过程中的干扰等。降噪处理对于视频监控、视频会议、电影后期制作以及任何需要高画质输出的应用场景都非常重…

PopChar for Mac v10.1激活版:特殊字符输入工具

PopChar for Mac是一款专为Mac用户设计的字符输入工具&#xff0c;其简单直观的功能使得查找和插入特殊字符变得轻而易举。 PopChar for Mac v10.1激活版下载 首先&#xff0c;PopChar为Mac提供了访问所有字体字符的能力&#xff0c;包括那些难以通过键盘直接输入的字符。用户只…

Mac YOLO V9推理测试

环境&#xff1a; Mac M1 (MacOS Sonoma 14.3.1) Python 3.11PyTorch 2.1.2 一、准备工作 工程及模型下载&#xff1a;​​​​​​​https://github.com/WongKinYiu/yolov9 git clone https://github.com/WongKinYiu/yolov9.git 克隆后安装相关依赖&#xff08;没啥依赖好装…

【智能算法】人工原生动物优化算法(APO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.获取代码 1.背景 2024年&#xff0c;X Wang受到自然界原生动物启发&#xff0c;提出了人工原生动物优化算法&#xff08; Artificial Protozoa Optimizer, APO&#xff09;。 2.算法原理 2.1算法思想 AP…

C++反汇编,指针和内存分配细节,面试题05

文章目录 20. 指针 vs 引用21. new vs malloc 20. 指针 vs 引用 指针是实体&#xff0c;占用内存空间&#xff0c;逻辑上独立&#xff1b;引用是别名&#xff0c;与变量共享内存空间&#xff0c;逻辑上不独立。指针定义时可以不初始化&#xff1b;引用定义时必须初始化。指针的…

一文玩转Vue3参数传递——全栈开发之路--前端篇(8)

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

【2024全国青少年信息素养大赛初赛时间以及模拟题】

2024全国青少年信息素养大赛时间已经出来了 目录 全国青少年信息素养大赛智能算法挑战赛初中模拟卷 全国青少年信息素养大赛智能算法挑战赛初中模拟卷 1、比赛时间和考试内容&#xff1a; 算法创意实践挑战赛初中组于5月19日举行&#xff0c;检录时间为10:30-11:00&#xf…

微服务---gateway网关

目录 gateway作用 gateway使用 添加依赖 配置yml文件 自定义过滤器 nacos上的gateway的配置文件 我们现在知道了通过nacos注册服务&#xff0c;通过feign实现服务间接口的调用&#xff0c;那对于不同权限的用户访问同一个接口&#xff0c;我们怎么知道他是否具有访问的权…

python:画折线图

import pandas as pd import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties# 设置新宋体字体的路径 font_path D:/reportlab/simsun/simsun.ttf# 加载新宋体字体 prop FontProperties(fnamefont_path)""" # 读取 xlsx 文件 d…

leetcode每日一题第七十二天

class Solution { public:TreeNode* searchBST(TreeNode* root, int val) {if(!root) return root;if(root->val val) return root;else if(root->val > val) return searchBST(root->left,val);else return searchBST(root->right,val);} };

了解tensorflow.js

1、浏览器中进行机器学习的优势 浏览器中进行机器学习&#xff0c;相对比与服务器端来讲&#xff0c;将拥有以下四大优势&#xff1a; 不需要安装软件或驱动&#xff08;打开浏览器即可使用&#xff09;&#xff1b;可以通过浏览器进行更加方便的人机交互&#xff1b;可以通过…

5.06号模拟前端面试8问

5.06号模拟前端面试8问 1.promise如何实现then处理 在JavaScript中&#xff0c;Promise 是一个代表异步操作最终完成或失败的对象。它有三种状态&#xff1a;pending&#xff08;等待&#xff09;&#xff0c;fulfilled&#xff08;完成&#xff09;&#xff0c;rejected&…

【Git】Git学习-15:分支简介和基本操作

学习视频链接&#xff1a;【GeekHour】一小时Git教程_哔哩哔哩_bilibili​编辑https://www.bilibili.com/video/BV1HM411377j/?vd_source95dda35ac10d1ae6785cc7006f365780https://www.bilibili.com/video/BV1HM411377j/?vd_source95dda35ac10d1ae6785cc7006f365780 git bran…

Superset二次开发之XAxis 功能优化

背景&#xff1a; 以柱状图&#xff08;来自Echarts 插件&#xff09;为例&#xff0c;如果X轴data数据过长&#xff0c;影响图表体验&#xff0c;为此需要省略部分内容 superset-frontend\plugins\plugin-chart-echarts\src\Timeseries\transformProps.ts import {getBaselin…

【C++】string类的使用②(容量接口Capacity || 元素获取Element access)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 前言&#x1f525;容量接口&#xff08;Capacity&#xff09;size和lengthcapacitymax_sizereserveresizeclearemptyshrink_to_fit &#x1f525;元素获取&#xff08;Ele…

【华为】IPSec VPN手动配置

【华为】IPSec VPN手动配置 拓扑配置ISP - 2AR1NAT - Easy IPIPSec VPN AR3NATIPsec VPN PC检验 配置文档AR1AR2 拓扑 配置 配置步骤 1、配置IP地址&#xff0c;ISP 路由器用 Lo0 模拟互联网 2、漳州和福州两个出口路由器配置默认路由指向ISP路由器 3、进行 IPsec VPN配置&…