++++++局部变量、全局变量及变量的存储类别++++====+++指针+++

局部变量、全局变量及变量的存储类别

局部变量与全局变量的基本概念

  1. 局部变量:在函数内部定义的变量称为局部变量,也称为内部变量。它们只在定义它们的函数内部有效,即只有在这个函数被调用时,局部变量才会被分配内存空间,函数执行完成后,局部变量所占用的内存空间会被释放。

  2. 全局变量:在函数外部定义的变量称为全局变量,也称为外部变量。全局变量的作用域是整个源程序,即从定义变量的位置开始到源文件结束。全局变量在程序的整个执行期间都占用内存中的存储单元,而不是仅在需要时才分配存储单元。

局部变量与全局变量的生存期与作用域

  1. 生存期

    • 局部变量的生存期是从函数被调用时开始,到函数执行完毕返回时结束。局部变量在函数调用时分配存储空间,函数结束时释放存储空间。
    • 全局变量的生存期是整个程序运行期间,从程序开始执行到程序结束。全局变量在程序开始执行前分配存储空间,程序结束时释放存储空间。
  2. 作用域

    • 局部变量的作用域是定义它的函数内部。在函数外部无法直接访问局部变量。
    • 全局变量的作用域是整个源程序。在程序的任何地方都可以直接访问全局变量。

代码示例

#include <stdio.h>

// 全局变量
int globalVar = 10;

void functionA() {
    // 局部变量
    int localVar = 20;
    
    printf("在functionA中,localVar = %d, globalVar = %d\n", localVar, globalVar);
}

int main() {
    // 在main函数中无法直接访问localVar,因为它是functionA的局部变量
    // 但可以访问globalVar,因为它是全局变量
    printf("在main中,globalVar = %d\n", globalVar);
    
    functionA(); // 调用functionA函数
    
    // 在main函数中依然可以访问globalVar
    printf("在main中,再次访问globalVar = %d\n", globalVar);
    
    return 0;
}

代码演示了全局变量和局部变量的区别。globalVar是全局变量,可以在整个程序中访问。而localVarfunctionA函数的局部变量,只能在functionA函数内部访问。在main函数中无法直接访问localVar

指针

1)指针的基本概念

指针是一个变量,其值为另一个变量的地址。换句话说,指针指向内存中的某个位置。

2)指针的运算(&,*),指针的基本运算

  • & 是取地址运算符,用于获取变量的地址。
  • * 是间接引用运算符(或称为解引用运算符),用于获取指针指向的值。
int x = 10;
int *ptr = &x; // ptr 是一个指向 int 的指针,其值为 x 的地址
printf("%p\n", (void*)ptr); // 输出 ptr 的值(地址),需要转换为 void* 来避免警告
printf("%d\n", *ptr); // 输出 ptr 指向的值,即 x 的值

3)指针与一维数组

在 C 语言中,数组名在大多数情况下被视为指向其第一个元素的指针。

int arr[] = {1, 2, 3, 4, 5};
int *p = arr; // p 指向 arr 的第一个元素
printf("%d\n", *(p+1)); // 输出 arr[1] 的值,即 2

4)指针与字符串

在 C 语言中,字符串通常是通过字符数组来表示的,但更常见的是使用字符指针来操作字符串(特别是当字符串是常量或来自外部源时)。

char str[] = "Hello"; // 字符数组
char *ptrStr = "World"; // 字符指针指向字符串常量
printf("%s\n", str); // 输出 "Hello"
printf("%s\n", ptrStr); // 输出 "World"

5)指针变量作函数的参数

函数可以接受指针作为参数,这使得函数能够修改其参数所指向的变量的值。

void increment(int *p) {
    (*p)++; // 增加 p 指向的值
}

int main() {
    int x = 5;
    increment(&x); // 传递 x 的地址给 increment 函数
    printf("%d\n", x); // 输出 6
    return 0;
}

例子中,increment 函数接受一个 int 指针作为参数,并增加该指针指向的值。在 main 函数中,我们传递了 x 的地址给 increment 函数,因此 x 的值在函数调用后被增加。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java学习【深入解读File类:从基础到高级的完整指南】

Java学习【深入解读File类&#xff1a;从基础到高级的完整指南】 ⭐File的概述和构造方法⭐File常见的成员方法&#x1f319;构造方法&#x1f319;length()&#x1f319;getAbsoluteFile()和getPath()&#x1f319;getName()和lastModified() ⭐文件的创建和删除⭐获取并遍历 …

从 0 打造私有知识库 RAG Benchmark 完整实践

背景介绍 最近从 0 构建了一个大模型知识库 RAG 服务的自动化 Benchmark 评估服务&#xff0c;可以基于私有知识库对 RAG 服务进行批量自动化测试与评估。本文是对这个过程的详细记录。 本文实际构建的是医疗行业知识库&#xff0c;基于高质量的医学指南和专家共识进行构建。…

8K Stars!Text2SQL还不够?试试更精准的RAG2SQL开源工具

▼618钜惠专场直播&#xff0c;点击预约按钮免费预约。 SQL 是查询数据库的关键&#xff0c;但如何高效地构建满足个人需求的 SQL 语句呢&#xff1f;随着 AI 大模型的进步&#xff0c;我们现在已经拥有了 Text2SQL 的技术&#xff0c;这一技术已被多款产品广泛应用。 今天&…

考研数学|做完《660》,做《880》还是吃力,怎么办?

880吃力说明基础还是不太扎实&#xff0c;建议配合知能行再刷880。 强化之前做660&#xff0c;然后在强化的时候再做880。 660整体难度属于基础阶段到强化阶段。而且是选填部分的题目&#xff0c;所以还是要做一些其他题 然后说一下推荐的习题册&#xff1a;基础不好先做1800、…

如何学习 Java 中的 Socket 编程,进行网络通信

Socket编程是网络编程的核心技术之一&#xff0c;它使得不同主机之间可以进行数据通信。Java提供了丰富的网络编程API&#xff0c;使得编写网络应用程序变得相对简单和直观。本文将详细讲解如何学习Java中的Socket编程&#xff0c;并通过示例代码展示如何实现网络通信。 一、S…

船舶能源新纪元:智能管理引领绿色航运潮流

在蓝色的大海上&#xff0c;无数船只乘风破浪&#xff0c;为全球的贸易和文化交流贡献着力量。然而&#xff0c;随着环保意识的提升和可持续发展的要求&#xff0c;船舶的能源消耗和排放问题逐渐成为了人们关注的焦点。在这个关键时刻&#xff0c;船舶能源管理系统应运而生&…

智能合约开发的过程

智能合约是一种运行在区块链上的程序&#xff0c;可以自动执行预先设定的条款和条件。智能合约具有去中心化、透明、不可篡改等特点&#xff0c;因此被广泛应用于金融、供应链、物联网等领域。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流…

西门子学习笔记12 - BYTE-REAL互相转化

这是针对于前面MQTT协议的接收和发送数组只能是BYTE数组做出的对应的功能块封装。 1、BYTE-REAL转化 1、把byte数组转成字符串形式 2、把字符串转成浮点数 2、REAL-BYTE转化 1、把浮点数转成字符串 2、把字符串转成Byte数组

通过编辑器工具改变Inspector锁定状态

是在看一系列视频的时候&#xff0c;看到的&#xff0c;感觉挺有用&#xff0c;就记录下来。 就是这个小锁的按钮&#xff0c;后续可以通过快捷键&#xff0c;快速锁定和解锁。代码里没有加入快捷键控制&#xff0c;有需要用到的可以自己加一下&#xff0c;比较简单 using Uni…

前端上传minio

参考【GitCode - 全球开发者的开源社区,开源代码托管平台】 注意事项&#xff1a;nodejs服务&#xff0c;文件扩展名为mjs&#xff0c;版本号8.0&#xff0c;引入的时候 import * as Minio from minio import Minio as * from minio// 实例化对象存储服务的MinIO客户端 // p…

c语言字符串函数详解(全)

字符串函数 1.strlen函数 求字符串长度的 //求字符串长度 int my_strlen(char* str) {int count 0;while (*str ! \0){count;*str;}return count; } int main() {char arr[] "abcdef";int red my_strlen(arr);printf("%d\n", red);return 0; } 2. st…

【MySQL】(基础篇十二) —— 子查询

分组数据 本文介绍什么是子查询以及如何使用它们。 SQL允许我们创建子查询&#xff08;subquery&#xff09;&#xff0c;即嵌套在其他查询中的查询。这样可以实现更复杂的查询&#xff0c;理解这个概念的最好方法是考察几个例子。 利用子查询进行过滤 需求&#xff1a;查询…

一行超长日志引发的 “血案” - Containerd 频繁 OOM 背后的真相

案发现场&#xff1a;混沌初现 2024年6月10日&#xff0c;本应是平静的一天。但从上午 9 点开始&#xff0c;Sealos 公有云的运维监控告警就开始不停地响。北京可用区服务器节点突然出现大量 “not ready” 告警&#xff0c;紧接着&#xff0c;系统自动触发 004 节点重启&…

重学java 75.JDK新特性 ① Lambda表达式

你所做的事情&#xff0c;也许暂时看不到成果&#xff0c;你不是没有成长&#xff0c;而是在扎根 —— 24.6.19 一、函数式编程思想和Lambda表达式定义格式 1.面向对象思想:是Java的核心编程思想 强调的是找对象,帮我们做事儿 比如:去北京 -> 强调的是怎么去,火车,高铁,飞机…

为什么人们对即将推出的 Go 1.23 迭代器感到愤怒

原文&#xff1a;gingerBill - 2024.06.17 TL;DR 它让 Go 变得太“函数式”&#xff0c;而不再是不折不扣的命令式语言。 最近&#xff0c;我在 Twitter 上看到一篇帖子&#xff0c;展示了 Go 1.23&#xff08;2024 年 8 月&#xff09;即将推出的 Go 迭代器设计。据我所知&a…

35 Debian如何配置Postfix+Dovecot

作者:网络傅老师 特别提示:未经作者允许,不得转载任何内容。违者必究! Debian如何配置Postfix+Dovecot 《傅老师Debian知识库系列之35》——原创 ==前言== 傅老师Debian知识库特点: 1、拆解Debian实用技能; 2、所有操作在VMware虚拟机实测完成; 3、致力于最终形成Deb…

网安人必备!开源网络安全工具TOP 10(附下载地址)

工欲善其事&#xff0c;必先利其器。对于广大的网络安全从业者&#xff0c;以及未来想要从事网络安全的人来说&#xff0c;选择并善用合适的网络安全工具&#xff0c;能有效提升工作效率。 开源网络安全工具之所以能够在众多安全解决方案中脱颖而出&#xff0c;不仅是因为它们…

1.22 LeetCode总结(基本算法)_位运算

进制的概念 进制即进位计数制&#xff0c;是利用固定的数字符号和统一的规则的带进位的计数方法。 任何一种进位计数制都有一个基数&#xff0c;基数为 X 的进位计数制称为 X 进制&#xff0c;表示每一个数位上的数运算时都是逢 X 进一。 504. 七进制数 手法1&#xff1a;当…

小林图解系统-二.硬件结构 2.4CPU缓存一致性

CPU Cache的数据写入 CPU和内存的访问性能越差越大&#xff0c;于是在CPU内部嵌入CPU Cache(高速缓存)。 CPU Cache由Cache Line组成&#xff0c;Cache Line由头标志Tag数据块Data Block组成。 如果数据写入Cache&#xff0c;内存和Cache相对应的数据将不同&#xff0c;需要…

排序(3)【归并排序】【计数排序】【排序算法度及其稳定性分析】

一.归并排序 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有…