C语言 存储类型 关键字

目录

一、C 程序中可用的存储类

二、C 语言部分关键字

1. sizeof关键字

2. sizeof 对变量名或者字面值可以不用括号,但是计算类型是必须要加括号的

3. sizeof 与 strlen 的区别

4. volatile关键字


一、C 程序中可用的存储类

概述:存储类定义 C 程序中变量/函数的存储位置、生命周期和作用域

  • 1. auto 存储类是局部变量默认存储类, 限定变量只能在函数内部使用。

    定义在函数中的变量默认为 auto 存储类,它们在函数开始时被创建,在函数结束时被销毁。

     int mount;
     auto int month;
  • 2. register 存储类用于定义寄存器变量:这些变量不存储在内存中,而是存储在寄存器中。寄存器变量与存储在 RAM 中的局部变量不同。寄存器变量的最大尺寸等于寄存器的大小(通常为一个字)。此外,不能对寄存器变量应用一元的 '&' 运算符,因为它们没有内存地址。

    由于寄存器变量存储在寄存器中,因此访问速度更快。然而,由于它们不是存储在 RAM 中,因此不能直接获取其地址。在需要频繁访问的变量上使用 register 存储类可以提高程序的运行速度。

     {
        register int  miles;
     }
  • 3. static 存储类编译器在程序的生命周期内保持局部变量的存在而不需要在每次它进入和离开作用域时进行创建和销毁因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值不变。

    static 修饰符也可以应用于全局变量。static 修饰全局变量时,会使变量的作用域限制在声明它的文件内它可以被该文件中的所有函数访问,包括 main() 函数。其它文件中使用extern 引用的方式是无法访问到这个变量的
    把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
    函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

#include <stdio.h>  
  
int* create_array() 
{  
    // 必须使用static 否者会在函数结束后被销毁
    static int arr[5] = {1, 2, 3, 4, 5};  
    return arr;  
}  
  
int main() 
{  
    int* ptr = create_array();  
    for (int i = 0; i < 5; ++i) 
    {  
        printf("%d ", ptr[i]);  
    }  
    return 0;  
}

静态变量在程序中只被初始化一次,即使函数被调用多次,该变量的值也不会重置。

  • 4. extern 存储类用于:声明定义在其他文件中的全局变量或函数当使用 extern 关键字时,不会为变量分配任何存储空间,把变量名指向一个之前定义过的存储位置。extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候,


二、C 语言部分关键字

概述:

1. sizeof关键字

作用:sizeof 在 编译阶段处理,作用为取得一个对象(数据类型或数据对象)的长度(即占用内存的大小,以1字节为单位)。

语法如:sizeof(对象);对象可以是变量 类型。

# include <stdio.h>
# include <string.h>

int main()
{
    int a;
	printf("sizeof(char): %d\n", sizeof(char));
	printf("sizeof(short): %d\n", sizeof(short));
	printf("sizeof(int): %d\n", sizeof(int));
	printf("sizeof(long): %d\n", sizeof(long));
	printf("sizeof(long long): %d\n", sizeof(long long));
	printf("sizeof(float): %d\n", sizeof(float));
	printf("sizeof(double): %d\n", sizeof(double));
    printf("sizeof(a): %d\n", sizeof(a));
	return 0;
}

结果

sizeof(char): 1
sizeof(short): 2
sizeof(int): 4
sizeof(long): 4
sizeof(long long): 8
sizeof(float): 4
sizeof(double): 8
sizeof(a): 4

2. sizeof 对变量名或者字面值可以不用括号,但是计算类型是必须要加括号的

# include <stdio.h>
# include <string.h>

int main()
{
	char c = 'a';

	printf("sizeof c: %d\n", sizeof c);
	printf("sizeof 1: %d\n", sizeof 1);
	return 0;
}

结果

sizeof c: 1
sizeof 1: 4

注意:但是如果直接使用sizeof int 则是不可以

3. sizeof 与 strlen 的区别

sizeof 是一个运算符,而不是函数。它用于获取指定类型或对象的字节大小。在编译时计算,返回的是字节数。通常用于获取数组、结构体、变量等的大小。

strlen 是一个函数,用于计算字符串的长度,即字符串中非空字符的数量,不包括字符串结束符 '\0'。在运行时遍历字符串直到遇到结束符,并返回字符数
sizeof 返回的是字节数,而 strlen 返回的是字符数,因此在计算字符串占用的内存时要考虑字符串结束符 \0。

sizeof  可以用数据类型作为参数,如int char;
strlen  只能使用 char*作参数且以\0为结尾
sizeof 为数组时候,不退化, 传递给strlen时数组会被退化成指针;

  • 当你传递一个数组给strlen时,实际上你传递的是一个指向数组第一个元素的指针。因此,在这种情况下,sizeof  strlen的行为是不同的:sizeof会返回整个数组的大小,而strlen会返回字符串的长度(不包括终止的\0)。

例如:

# include <stdio.h>
# include <string.h>

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
	printf("sizeof(arr): %d\n", sizeof(arr));
	
    char arr2[] = "hello";
	printf("sizeof(arr2): %d\n", sizeof(arr2));
	printf("strlen(arr2): %d\n", strlen(arr2));
	return 0;
}

结果:

sizeof(arr): 40
sizeof(arr2): 6  // 包含空字符\0的一个字节
strlen(arr2): 5

使用sizeof计算数组时,结果为数组长度*数组元素占用空间的大小,当数组为字符数组时,sizeof的功能是一致的,只不过当使用字符数组定义字符串的时候,对于字符串比如hello,数组中会自动增加一个元素’\0’,所以sizeof计算的结果为6,而strlen是计算字符串长度的,遇到’\0’结束,但是不把’\0’计算在内,因此strlen计算的结果为5,这与我们感觉上的字符串的长度为5的感觉是一致的,这就是strlen和sizeof在计算字符数组的时候的区别

4. volatile关键字

我们可以实时获取它这个变量的最新值

volatile它就是一个“易变”的一个变量,我们每次获取它值的时候,都是从它内存里去读取。

更深层次含义: 用volatile这样来告诉编译器,叫它不要对我这个变量做过分优化,也就是告诉它我这个变量用在哪,就实打实的访问它的内存,而不是访问这个变量所构建的一个寄存器。

我们用这样的变量的时候,它可能同时被好几个中断或者好几个线程同时调用,我们volatile这样的变量可以保证获取这个变量值的实时性

即:volatile关键字是告诉编译器不要优化修饰的变量,直接访问它。

volatile int flag;

上一篇:C语言数据类型

下一篇: 

  • 35
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要遍历C语言中的关键字,可以使用C语言标准库中的<string.h>头文件和<ctype.h>头文件中的函数。下面是一种实现方式: 1. 定义一个字符数组来存储C语言的所有关键字,例如: ``` char *keywords[] = {"auto", "break", "case", "char", "const", "continue", "default", "do", "double", "else", "enum", "extern", "float", "for", "goto", "if", "int", "long", "register", "return", "short", "signed", "sizeof", "static", "struct", "switch", "typedef", "union", "unsigned", "void", "volatile", "while"}; ``` 2. 对于输入的每个单词,使用C语言标准库中的<ctype.h>头文件中的函数检查它是否为关键字。例如,使用strcmp函数比较输入的单词是否与数组中的任何一个关键字相等: ``` int is_keyword(char *word) { int i, n; n = sizeof(keywords) / sizeof(char *); for (i = 0; i < n; i++) { if (strcmp(word, keywords[i]) == 0) { return 1; } } return 0; } ``` 3. 对于输入的每个单词,还需要使用C语言标准库中的<ctype.h>头文件中的函数将其转换为小写字母,以便与关键字数组中的字符串进行比较。例如,使用tolower函数将单词转换为小写字母: ``` void to_lower(char *word) { while (*word) { *word = tolower(*word); word++; } } ``` 4. 最后,可以将输入的文本分解成单词,并调用is_keyword函数和to_lower函数来检查它们是否为关键字。 以下是一个完整的示例程序,演示如何遍历C语言中的关键字: ``` #include <stdio.h> #include <string.h> #include <ctype.h> char *keywords[] = {"auto", "break", "case", "char", "const", "continue", "default", "do", "double", "else", "enum", "extern", "float", "for", "goto", "if", "int", "long", "register", "return", "short", "signed", "sizeof", "static", "struct", "switch", "typedef", "union", "unsigned", "void", "volatile", "while"}; int is_keyword(char *word) { int i, n; n = sizeof(keywords) / sizeof(char *); for (i = 0; i < n; i++) { if (strcmp(word, keywords[i]) == 0) { return 1; } } return 0; } void to_lower(char *word) { while (*word) { *word = tolower(*word); word++; } } int main() { char text[] = "for (int i = 0; i < n; i++) { printf(\"%d\\n\", i); }"; char *word; word = strtok(text, " "); ### 回答2: 在C语言中,关键字是预定义的标识符,用于表示语言中的特殊功能和结构。要遍历C语言中的关键字,可以按照以下步骤进行: 1. 创建包含C语言所有关键字的数组。根据C语言的标准,可以将关键字存储在一个字符串数组中。 2. 使用循环结构,遍历数组中的每个关键字。可以使用for循环或while循环来实现遍历。 3. 在循环中,将每个关键字打印出来或进行其他操作。可以使用printf函数将关键字输出到控制台上,也可以将其存储在新的数组或其他数据结构中。 4. 执行完循环后,即可遍历所有的C语言关键字。 下面是一个简单的示例代码,用于遍历C语言中的关键字: ```c #include<stdio.h> #include<string.h> int main() { char* keywords[] = {"auto", "break", "case", "char", "const", "continue", "default", "do", "double", "else", "enum", "extern", "float", "for", "goto", "if", "int", "long", "register", "return", "short", "signed", "sizeof", "static", "struct", "switch", "typedef", "union", "unsigned", "void", "volatile", "while"}; int numKeywords = sizeof(keywords) / sizeof(keywords[0]); for(int i = 0; i < numKeywords; i++) { printf("%s\n", keywords[i]); } return 0; } ``` 以上代码通过使用循环遍历并打印出C语言中的所有关键字。运行代码后,会依次打印出每个关键字,完成关键字的遍历。 ### 回答3: 要遍历C语言中的关键字,首先需要了解C语言关键字有哪些。C语言中的关键字是由编译器预先定义的,用于表示特定功能或命令的保留字。 C语言中的关键字共有32个,包括基本数据类型(如int、float、char等)、流程控制语句(如if、while、for等)、函数定义关键字(如void、return等)等。 遍历C语言中的关键字可以采用以下步骤: 1. 定义一个字符串数组,用于存储C语言中的关键字。 2. 创建一个循环,循环变量从0到31(因为C语言中一共有32个关键字)。 3. 在循环中,依次将每个关键字赋值给字符串数组中的元素。 4. 遍历完所有关键字后,输出或处理字符串数组中的关键字。 以下是示例代码: ``` #include <stdio.h> #include <string.h> int main() { char keywords[32][10] = {"auto", "break", "case", "char", "const", "continue", "default", "do", "double", "else", "enum", "extern", "float", "for", "goto", "if", "int", "long", "register", "return", "short", "signed", "sizeof", "static", "struct", "switch", "typedef", "union", "unsigned", "void", "volatile", "while"}; int i; for (i = 0; i < 32; i++) { printf("%s\n", keywords[i]); } return 0; } ``` 以上代码会将C语言中的关键字遍历并逐个输出。可以根据实际需求,将关键字存储到其他数据结构中,或进行其他处理操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值