C++ 解引用与函数基础:内存地址、调用方法及声明
C++ 解引用
获取内存地址和值
在上一页的示例中,我们使用了指针变量来获取变量的内存地址(与引用运算符 & 一起使用)。但是,你也可以使用指针来获取变量的值,这可以通过使用 * 运算符(解引用运算符)来实现:
string food = "Pizza"; // 变量声明
string* ptr = &food; // 指针声明
// 引用:使用指针输出 food 的内存地址(0x6dfed4)
cout << ptr << "\n";
// 解引用:使用指针输出 food 的值(Pizza)
cout << *ptr << "\n";
需要注意的是,符号 * 在这里可能会让人感到困惑,因为它在我们的代码中有两种不同的作用:
- 在声明中使用时(
string* ptr),它创建一个指针变量。 - 在非声明中使用时,它作为解引用运算符。
修改指针值
你可以改变指针的值。但要注意,这也会改变原始变量的值:
string food = "Pizza";
string* ptr = &food;
// 输出 food 的值(Pizza)
cout << food << "\n";
// 输出 food 的内存地址(0x6dfed4)
cout << &food << "\n";
// 访问 food 的内存地址并输出其值(Pizza)
cout << *ptr << "\n";
// 改变指针的值
*ptr = "Hamburger";
// 输出指针的新值(Hamburger)
cout << *ptr << "\n";
// 输出 food 变量的新值(Hamburger)
cout << food << "\n";
解引用指针的注意事项
- 解引用指针时,要确保指针指向有效的内存地址,否则会导致程序崩溃。
- 不要解引用空指针,这会导致程序崩溃。
- 修改指针的值可能会导致意外的结果,应谨慎操作。
总结
解引用是 C++ 中一个重要的概念,它允许你获取指针指向的变量的值或内存地址。在使用解引用运算符时,要遵循一些注意事项,以避免程序崩溃或意外结果。
C++ 函数
函数概述
函数是一组用于执行特定任务的封装代码块。它们可以提高代码的可重用性、可读性和可维护性。
创建函数
在 C++ 中,创建函数需要遵循以下语法:
returnType functionName(parameterList) {
// 函数体
}
其中:
returnType:函数的返回值类型,可以是void(无返回值)或其他数据类型。functionName:函数名称,由字母、数字和下划线组成,但不能以数字开头。parameterList:函数参数列表,参数之间用逗号分隔,每个参数由数据类型和参数名组成。函数体:函数要执行的代码,由花括号括起来。
例如,以下代码创建了一个名为 printMessage 的函数,该函数接收一个字符串参数并将其打印到控制台:
void printMessage(string message) {
cout << message << endl;
}
函数调用
要调用函数,只需在代码中写下函数名及其参数值,例如:
printMessage("Hello, world!");
函数参数
函数参数可以是输入参数、输出参数或输入输出参数。
- 输入参数:函数从调用者接收数据。
- 输出参数:函数将数据返回给调用者。
- 输入输出参数:函数既可以接收数据又可以返回数据。
在 C++ 中,函数参数默认是输入参数。要声明输出参数或输入输出参数,需要使用引用或指针。
函数返回值
函数可以返回一个值给调用者。返回值类型写在函数声明的括号前面,例如:
int square(int number) {
return number * number;
}
该函数接收一个整数参数 number,并返回其平方值。要调用该函数并获取返回值,可以使用以下代码:
int result = square(5);
cout << result << endl; // 输出 25
函数声明和定义
函数声明告诉编译器函数的名称、返回值类型和参数列表,而函数定义提供了函数要执行的代码。
函数声明通常放在程序的开头,而函数定义放在后面。例如:
// 函数声明
void printMessage(string message);
int square(int number);
// ...
// 函数定义
void printMessage(string message) {
cout << message << endl;
}
int square(int number) {
return number * number;
}
函数重载
函数重载是指允许使用相同名称但不同参数列表的多个函数。例如:
void printMessage(string message) {
cout << message << endl;
}
void printMessage(int number) {
cout << number << endl;
}
在调用这些函数时,需要根据实际参数类型选择正确的函数。
函数的作用域
函数的作用域是指函数内的变量和函数名在程序中可见的范围。函数内的变量和函数名只在该函数内可见,在其他函数中不可见。
总结
函数是 C++ 中重要的编程概念,它们可以提高代码的可重用性、可读性和可维护性。通过理解函数的声明、定义、调用和参数传递等概念,您可以编写更简洁、更有效的 C++ 程序。
最后
为了方便其他设备和平台的小伙伴观看往期文章:
微信公众号搜索:Let us Coding,关注后即可获取最新文章推送
看完如果觉得有帮助,欢迎点赞、收藏、关注
C++ 解引用与函数基础:内存地址、调用方法及声明的更多相关文章
- JavaScript函数的4种调用方法详解
在JavaScript中,函数是一等公民,函数在JavaScript中是一个数据类型,而非像C#或其他描述性语言那样仅仅作为一个模块来使用.函数有四种调用模式,分别是:函数调用形式.方法调用形式.构造 ...
- 优雅的重载toString方法,打印对象内容而不是打印内存地址的方法
如果直接在日志或者System.out.println中打印java对象,会打印这个对象的内存地址,而不是具体内容. 为了便于调试,一般的做法有2种: 1.重写toStrong方法 2.将对象传入JS ...
- php函数的种类与调用方法大揭密
PHP中的函数看上去很简单,实际上功能非常强大,我这里按函数名称是否固定,可以分为以下三大类: 一.名称固定的函数: 这类函数,也叫:常规函数,直接用关键字function来创建,也是大家最熟悉的类型 ...
- JavaScript 函数的4种调用方法
JavaScript 函数有 4 种调用方式. 每种方式的不同方式在于 this 的初始化. 作为一个函数调用 function myFunction(a, b) { return a * b; } ...
- 利用mysql的inet_aton()和inet_ntoa()函数存储IP地址的方法
原文:https://www.jb51.net/article/29962.htm 当前很多应用都适用字符串char(15)来存储IP地址(占用16个字节),利用inet_aton()和inet_nt ...
- JS函数的定义与调用方法
JS函数调用的四种方法:方法调用模式,函数调用模式,构造器调用模式,apply,call调用模式 1.方法调用模式:先定义一个对象,然后在对象的属性中定义方法,通过myobject.property来 ...
- 【转】JS函数的定义与调用方法
JS函数调用的四种方法:方法调用模式,函数调用模式,构造器调用模式,apply,call调用模式 1.方法调用模式:先定义一个对象,然后在对象的属性中定义方法,通过myobject.property来 ...
- WebApiClient.AOT.dll 调用api地址 -> 调用方法
优点:简化api调用过程,WebApiClient.AOT.dll中的IHttpApi接口 缺点:只适用于内部服务之间的调用(没有验证过程) 1.继承IHttpAPi接口 public interfa ...
- Java基础 throws 提示调用方法时要注意处理相关异常
JDK :OpenJDK-11 OS :CentOS 7.6.1810 IDE :Eclipse 2019‑03 typesetting :Markdown code ...
- python中的函数对象的内存地址是多少
今天和同学讨论一个问题,发现了函数的内存地址和我想象的不一样. 我以为同一个函数,假如给的参数不一样,那么这两个函数的id就不一样. 然后经过实验,发现python为了便于管理函数,所有的函数都放在同 ...
随机推荐
- 各类LLM模型分析比较
Large Language Model 模型对比 对于LLM模型框架主要如下3类[1]:1.autoregressive,2.autoencoding,3.encoder-decoder.主要对3类 ...
- 小程序开发:app.vue检测更新时判断是否是朋友圈进入
因为如果从朋友圈点进小程序来的,有些功能就用不了,所以需要判断下是否从朋友圈点进来的. 检查代码如下: checkScene() { // 判断场景值 如果是从分享到朋友圈再打开 就会有一些功能无法使 ...
- 十四: Mysql数据结构选择的合理性
Mysql数据结构选择的合理性 从MySQL的角度讲,不得不考虑一个现实问题就是磁盘I/O. 如果我们能让索引的数据结构尽量减少硬盘的I/O操作,所消耗的时间也就越小.可以说,磁盘的I/O操作次数对索 ...
- Failed to execute goal on project WebBackend: Could not resolve dependencies for project com.lang.yi:WebBackend:jar:1.0.0
一.问题由来 自己在搭建项目的时候报一个错误,如标题所示,具体错误信息如下: Failed to execute goal on project WebBackend: Could not resol ...
- deepin平台安装debian的cao蛋时
我在deepin系统安装别的系统的时候,一直在boot界面无法进行下一步.困扰了我好几天,最后从电脑的左侧换成了电脑的右侧(usb)接口. 终于安装成功.你是......牛(deepin)
- 恒玄科技BES250解决方案之双耳链接调试总结和源码分析
一 前言 bes2500芯片在tws耳机应用十分广泛,该芯片有着资源强大,音质好,大厂背书等特色.吸引了不少粉丝跟随. 最近在调试该芯片的tws配对流程,花费了一些时间,踩了一些坑,这里做一个总结和备 ...
- electron 中如何安装或更新 vuejs-devtool 最新稳定版
手上正在开发的项目是vue3.0 通过添加 vue-cli-plugin-electron-builder 插件生成 electron 项目,项目在开发过程中发现 beta版的 vuejs-devto ...
- java中float内存存储原理
规格化表示: 浮点数采用的是IEEE Standard 754 Floating Point Numbers标准 float占用4个字节,和int一样,也是32bit. 第1个bit表示符号,0表示正 ...
- 4项关键技术提升 XR 扩展现实体验-XR应用云流化
无论是使用户能够协作设计电动赛车,还是帮助观众通过数字世界与自然互动,越来越多的企业利用XR扩展现实为用户提供沉浸式逼真的虚拟环境. 下一代沉浸式技术的应用越来越广泛,图形和人工智能的最新突破正在扩展 ...
- Flutter如何状态管理
目录介绍 01.什么是状态管理 02.状态管理方案分类 03.状态管理使用场景 04.Widget管理自己的状态 05.Widget管理子Widget状态 06.简单混合管理状态 07.全局状态如何管 ...