迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C语言 >

C 中的 register 关键字

作者:迹忆客 最近更新:2023/05/05 浏览次数:

本文将讨论 C 编程语言中的 register 关键字。


C语言中register关键字概述

C 程序中的所有变量都保存到内存中,每个变量都有其内存地址。 但是,如果将 register 关键字与变量一起使用,编译器更有可能将变量保存在 CPU 寄存器中而不是内存中。

如果您不知道,处理器具有有限数量的通用寄存器,中央处理器 (CPU) 负责在对数据执行算术或逻辑运算之前将所有变量加载到各自的寄存器中。

寄存器比内存快得多,CPU 的访问定时器相应地更短。

因此,我们将寄存器关键字与在整个程序中出现频率最高的变量配对。 register 关键字告诉编译器所讨论的变量应该存储在处理器寄存器中,以便可以在尽可能短的时间内检索到它。

但是,由编译器决定是否将该变量存储在内存或处理器寄存器中。

让我们看看可以在程序中使用 register 关键字的多个场景。


C语言中register关键字的使用

下面是 C 编程语言中使用的 register 关键字的一个简单示例。

#include <stdio.h>

int main() {
    register char a = 'S';
    register double b = 10;
    register int c = 8;
    printf("The value of register variable a: %c\n",a);
    printf("The value of register variable b: %f\n", b);
    printf("The value of register variable c: %d", c);
    return 0;
}

输出:

The value of register variable a: S
The value of register variable b: 10.000000
The value of register variable c: 8

在 C 中获取寄存器变量的地址

假设您将 register 关键字与变量一起放置。 在这种情况下,即使编译器决定将变量存储在内存中而不是 CPU 寄存器中,您也无法使用一元地址运算符访问变量的地址。

这是一个需要牢记的重要事实。

如果将地址运算符 & 与寄存器变量结合使用,您使用的编译器将给您警告或错误。 您收到的消息将取决于它是哪一个。

因为当你对变量使用 register 关键字时,变量的值可以放在处理器寄存器中而不是内存中,而处理器寄存器没有任何地址。 让我们举个例子。

#include <stdio.h>
int main()
{
    register int registerVariable = 22;
    int* ptr = &registerVariable;
    printf("%d", *ptr);
    return 0;
}

输出:

main.c: In function ‘main’:
main.c:5:5: error: address of register variable ‘registerVariable’ requested
    5 |     int* ptr = &registerVariable;
      |     ^~~

在 C 中将 register 关键字与指针变量一起使用

register 关键字可以与指针一起使用。 它可以具有内存位置的地址。

下面是在 C 编程语言中与指针变量一起使用的 register 关键字的示例。

#include<stdio.h>

int main()
{
    int value = 15;
    register int* pointerVariable = &value;
    printf("The value of the pointer is: %d", *pointerVariable);
    return 0;
}

输出:

The value of the pointer is: 15

在 C 中使用带有 register 关键字的存储类

C 编程语言不允许对单个变量使用各种存储类说明符。 寄存器是一个存储类。

因此,您不能将寄存器与 static、auto 和 extern 结合使用。

#include<stdio.h>

int main()
{
    auto register int value = 15;
    printf("The value of the pointer is: %d", value);
    return 0;
}

输出:

main.c: In function ‘main’:
main.c:5:5: error: multiple storage classes in declaration specifiers
    5 |     auto register int value = 15;
      |     ^~~~

C 语言中寄存器变量的作用域

只能将 register 关键字与局部变量结合使用; 不可能将寄存器与具有全局范围的变量一起使用。

#include<stdio.h>

register int value = 22;
int main()
{
    printf("%d", value);
    return 0;
}

输出:

main.c:3:14: error: register name not specified for ‘value’
    3 | register int value = 22;
      |

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C 语言中使用 typedef enum

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。

C 语言中的静态变量

发布时间:2023/05/07 浏览次数:151 分类:C语言

本文介绍了如何在 C 语言中使用静态变量。在 C 语言中使用 static 变量在函数调用之间保存变量值

C 语言中生成随机数

发布时间:2023/05/07 浏览次数:64 分类:C语言

本文演示了如何在 C 语言中生成随机数。使用 rand 和 srand 函数在 C 语言中生成随机数

C 语言中的 i++ 与++i

发布时间:2023/05/07 浏览次数:83 分类:C语言

本文演示了如何在 C 语言中使用前缀增量与后缀增量运算符。C 语言中++i 和 i++ 记号的主要区别

C 语言中获取当前工作目录

发布时间:2023/05/07 浏览次数:182 分类:C语言

本文演示了如何在 C 语言中获取当前工作目录。使用 getcwd 函数获取当前工作目录的方法

C 语言中的位掩码

发布时间:2023/05/07 浏览次数:126 分类:C语言

本文介绍了如何在 C 语言中使用位掩码。使用 struct 关键字在 C 语言中定义位掩码数据

C 语言中的排序函数

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文演示了如何在 C 语言中使用标准库排序函数。使用 qsort 函数对 C 语言中的整数数组进行排序

C 语言中的 extern 关键字

发布时间:2023/05/07 浏览次数:114 分类:C语言

本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量

C 语言中的 #ifndef

发布时间:2023/05/07 浏览次数:186 分类:C语言

本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便