目录
2. sizeof 对变量名或者字面值可以不用括号,但是计算类型是必须要加括号的
概述:存储类定义 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 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候,
概述:
作用: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
# 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 则是不可以
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
strlen(arr2): 5
使用sizeof计算数组时,结果为数组长度*数组元素占用空间的大小,当数组为字符数组时,sizeof的功能是一致的,只不过当使用字符数组定义字符串的时候,对于字符串比如hello,数组中会自动增加一个元素’\0’,所以sizeof计算的结果为6,而strlen是计算字符串长度的,遇到’\0’结束,但是不把’\0’计算在内,因此strlen计算的结果为5,这与我们感觉上的字符串的长度为5的感觉是一致的,这就是strlen和sizeof在计算字符数组的时候的区别
我们可以实时获取它这个变量的最新值
volatile它就是一个“易变”的一个变量,我们每次获取它值的时候,都是从它内存里去读取。
更深层次含义: 用volatile这样来告诉编译器,叫它不要对我这个变量做过分优化,也就是告诉它我这个变量用在哪,就实打实的访问它的内存,而不是访问这个变量所构建的一个寄存器。
我们用这样的变量的时候,它可能同时被好几个中断或者好几个线程同时调用,我们volatile这样的变量可以保证获取这个变量值的实时性
即:volatile关键字是告诉编译器不要优化修饰的变量,直接访问它。
volatile int flag;
上一篇:C语言数据类型
下一篇:?