嵌入式知识点总结 C/C++ 专题提升(五)-变量 数组

目录

1.全局变量和静态变量的区别是什么?

2.全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

[3.局部变量能否和全局变量重名 ?](#3.局部变量能否和全局变量重名 ?)

4.数组、指针和解引用操作

5.数组的下标可以为负数吗?


1.全局变量和静态变量的区别是什么?

1.全局变量的作用域为程序块,而局部变量的作用域为当前函数。

2.内存存储方式不同,全局变量(静态全局变量,静态局部变量)分配在全局数据区(静态存储空间),后者分配在栈区。

3.生命周期不同。全局变量随主程序创建而创建,随主程序销毁而销毁,局部变量在局部函数内部甚至局部循环体等内部存在,退出就不存在了,

4.使用方式不同。通过声明为全局变量,程序的各个部分都可以用到,而局部变量只能在局部使用。

2.全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。

3.局部变量能否和全局变量重名 ?

能,局部会屏蔽全局。局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。

4.数组、指针和解引用操作

*(a[1] + 1)

cpp 复制代码
int a[3][3] = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};
*(a[1] + 1);  // 结果是 5,因为 a[1] 是指向第二行的指针,而 (a[1] + 1) 指向第二行的第二个元素,即 5。

*(&a[1][1])

cpp 复制代码
int a[3][3] = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};
*(&a[1][1]);  // 结果是 5,直接访问 a[1][1] 的值。

(*(a+1))[1]

cpp 复制代码
int a[3][3] = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};
(*(a + 1))[1];  // 结果是 5,*(a + 1) 获取第二行的指针,接着 [1] 访问第二行的第二个元素。

5.数组的下标可以为负数吗?

可以,因为下标只是给出了一个与当前地址的偏移量而已,只要根据这个偏移量能定位得到目标地址即可。下面给出一个下标为负数的示例:

数组下标取负值的情况:

cpp 复制代码
#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr = arr + 2;  // 将 ptr 指向数组中的第三个元素

    printf("arr[2] = %d\n", *(ptr));       // 正常访问 arr[2],输出 3
    printf("arr[1] = %d\n", *(ptr - 1));   // 负偏移访问 arr[1],输出 2
    printf("arr[0] = %d\n", *(ptr - 2));   // 负偏移访问 arr[0],输出 1

    return 0;
}
  • arr 是一个有 5 个元素的数组,arr[0]arr[4]
  • ptr = arr + 2ptr 指向数组的第三个元素(即 arr[2])。
  • 使用指针算术 *(ptr - 1)*(ptr - 2) 访问前两个元素。
相关推荐
AA陈超32 分钟前
虚幻引擎UE5专用服务器游戏开发-20 添加基础能力类与连招能力
c++·游戏·ue5·游戏引擎·虚幻
qq_4112624240 分钟前
整体无需占用任何硬件 UART,即可新增一条全双工软串口
单片机·嵌入式硬件
阿捏利1 小时前
C Primer Plus 第6版 编程练习——第7章(上)
c语言·编程题·c primer plus
mit6.8241 小时前
[Meetily后端框架] AI摘要结构化 | `SummaryResponse`模型 | Pydantic库 | vs marshmallow库
c++·人工智能·后端
R-G-B1 小时前
【02】MFC入门到精通——MFC 手动添加创建新的对话框模板
c++·mfc·mfc 手动添加创建新的对话框
linux kernel1 小时前
第七讲:C++中的string类
开发语言·c++
jz_ddk1 小时前
[实战]调频(FM)和调幅(AM)信号生成(完整C语言实现)
c语言·算法·信号处理
Tipriest_1 小时前
[数据结构与算法] 优先队列 | 最小堆 C++
c++·优先队列·数据结构与算法·最小堆
宛西南浪漫戈命2 小时前
Centos 7下使用C++使用Rdkafka库实现生产者消费者
c++·centos·linq
码农Cloudy.2 小时前
C语言<数据结构-链表>
c语言·数据结构·链表