C++ 解引用与函数基础:内存地址、调用方法及声明

简介: C++ 中的解引用允许通过指针访问变量值。使用 `*` 运算符可解引用指针并修改原始变量。注意确保指针有效且不为空,以防止程序崩溃。函数是封装代码的单元,用于执行特定任务。理解函数的声明、定义、参数和返回值是关键。函数重载允许同一名称但不同参数列表的函数存在。关注公众号 `Let us Coding` 获取更多内容。

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,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎点赞、收藏、关注

相关文章
|
5月前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
1173 2
|
6月前
|
存储 缓存 监控
用 C++ 红黑树给公司电脑监控软件的日志快速排序的方法
本文介绍基于C++红黑树算法实现公司监控电脑软件的日志高效管理,利用其自平衡特性提升日志排序、检索与动态更新效率,并结合实际场景提出优化方向,增强系统性能与稳定性。
186 4
|
8月前
|
安全 C语言 C++
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
278 26
|
8月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
391 15
|
9月前
|
C语言 C++
c与c++的内存管理
再比如还有这样的分组: 这种分组是最正确的给出内存四个分区名字:栈区、堆区、全局区(俗话也叫静态变量区)、代码区(也叫代码段)(代码段又分很多种,比如常量区)当然也会看到别的定义如:两者都正确,记那个都选,我选择的是第一个。再比如还有这样的分组: 这种分组是最正确的答案分别是 C C C A A A A A D A B。
167 1
|
9月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
233 0
|
12月前
|
存储 Linux C语言
C++/C的内存管理
本文主要讲解C++/C中的程序区域划分与内存管理方式。首先介绍程序区域,包括栈(存储局部变量等,向下增长)、堆(动态内存分配,向上分配)、数据段(存储静态和全局变量)及代码段(存放可执行代码)。接着探讨C++内存管理,new/delete操作符相比C语言的malloc/free更强大,支持对象构造与析构。还深入解析了new/delete的实现原理、定位new表达式以及二者与malloc/free的区别。最后附上一句鸡汤激励大家行动缓解焦虑。
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
741 6
|
安全 C语言 C++
彻底摘明白 C++ 的动态内存分配原理
大家好,我是V哥。C++的动态内存分配允许程序在运行时请求和释放内存,主要通过`new`/`delete`(用于对象)及`malloc`/`calloc`/`realloc`/`free`(继承自C语言)实现。`new`分配并初始化对象内存,`delete`释放并调用析构函数;而`malloc`等函数仅处理裸内存,不涉及构造与析构。掌握这些可有效管理内存,避免泄漏和悬空指针问题。智能指针如`std::unique_ptr`和`std::shared_ptr`能自动管理内存,确保异常安全。关注威哥爱编程,了解更多全栈开发技巧。 先赞再看后评论,腰缠万贯财进门。
539 0
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。