auto
- C语言种局部变量的默认属性,所有局部变量默认为auto
static
- 静态属性,修饰的变量储存在程序静态区
- 另有文件作用域标示符,限定文件域
#include <stdio.h>
int fun()
{
static int count = 0;
count ++;
return count;
}
int main()
{
int i;
for(i=0;i<5;i++)
printf("%d ",fun());
printf("\n");
return 0;
}
register
指明变量储存于寄存器中,发出请求但不一定成功
而且register必须是CPU 寄存器可以接受的值,不能用&运算符获取register变量的地址
void
修饰函数的返回值和参数,仅仅代表 “无”
extern
用于声明外部定义的变量和函数,还可以用于告诉编译器用C方式编译
sizeof
- sizeof是编译器的内置指示符,不是函数
- sizeof用于“计算”相应实体所占的内存大小
- sizeof的值在编译期就已经确定
const
- 在C语言中const修饰的变量是只读的,其本质还是变量
- const修饰的变量会在内存占用空间
- 本质上const只对编译器有用,在运行时无用,可以通过指针 来改变修饰变量的值
(不同版本的编译器可能会有不同结果)
#include<stdio.h>
int main()
{
const int temp = 10;
int* p = (int*)&temp;
*p = 15;
printf("%d\n",temp);
return 0;
}
2.const修饰数组只可读,空间不可以被改变
3.const修饰指针
const int* p; //p可变,p指向的内容不可变
int const* p; //p可变,p指向的内容不可变
int* const p; //p不可变,p指向的内容可变
const int* const p; //p和p指向的内容都不可变
当const出现在*号左边时指针指向的数据为常量
当const出现在*后右边时指针本身为常量
4.const修饰函数参数和返回值
- const修饰函数参数表示在函数体内不希望改变参数的值
- const修饰函数返回值表示返回值不可改变,多用于返回指针的情形
const int* fun()
{
static int count = 0;
count ++;
return &count;
}
volatile
- volatile用于告诉编译器必须每次去内存中取变量值
- volatile主要修饰可能被多个线程访问的变量
- volatile也可以修饰可能被未知因数更改的变量
- volatile可理解为“编译器警告指示字”
int num = 10;
int a = 0;
int b = 0;
a = num ;
sleep(100);
b = num;
/*
编译器在编译的时候发现obj没有被当成左值使用,
因此会“聪明”的直接将obj替换成10,而把a和b都赋值为10。
*/
struct
定义结构体,空结构体内存一般为1个字节
柔性数组
结构体中最后一个元素是未知大小的数组
struct{
int a;
int array[];
};
union
union和struct的区别
- struct中的每个域在内存中都独立分配空间
- union只分配最大域的空间,所有域共享这个空间
struct{
int a;
int b;
int c;
};
//分配12个字节
union{
int a;
int b;
int c;
};
//只分配4个字节
union的使用受系统大小端的影响
enum
- enum是一种自定义类型
- enum默认常量在前一个值的基础上依次加1
- enum类型的变量只能取定义时的离散值
typedef
- typedef用于给一个已经存在的数据类型重命名
- typedef并没有产生新的类型
- typedef重定义的类型不能进行unsigned和signed扩展
typedef和#define的区别
- typedef是给已有类型取别名
- #define为简单的字符串替换,无别名的概念
基于国嵌C语言培训学习