基本内置类型 声明与定义 static与entern const auto register volatile

基本内置类型:

       1.整型:分为带符号整型和无符号整型两种。

       2.实型:分为3种::单精度型(4个字节)、双精度型(8Byte)、长双精度型

       3. 构造类型:定义:由若干个相关的数据组合在一起形成的一种复杂数据类型,构造数据类型的成分数据可以是基本数据类型的,也可以是别的构造类型的。数组类型,结构类型,共用类型。

       4.指针类型:取程序对象(如变量)在内存中占据的地址为值的一种特殊的数据类型。

       5.枚举类型:当变量只取很少几种可能的值,并使用标识符对值命名时,这种变量的数据类型,可用枚举类型来表示。

       6.void类型:可以表示没有数据(没有结果,没有形式参数),也可以表示某种任意类型的数据。void表示空类型,void*表示任意数据的指针类型,程序如要使用void类型的数据,应该将它强制的转换成某种具体的指针类型。

.数据类型极其字节数

     

类型说明符

字节数

int

2或4

unsigned int

2或4

short  int

2

unsigned  short  int

2

long  int

4

unsigned  long

4

char

1

unsigned  char

1

.有符号数:最高位为1,表示这个数为负数,其值为除最高位以外的剩余位的值添上号;如果最高位是0,表明这个数是正数,其数为除最高位以外的剩余位的值。

补码:正数补码=原码,负数补码=除符号位各位取反整体+1

声明与定义
定义:创建一个对象,并为这个对象分配一块内存命名(一个变量或对象在一定的区域内只能被定义一次)

声明:两重含义
一、 告诉编译器某个名字已经匹配到一块内存上了。声明可以多次出现
二、告诉编译器某个名字已经被占用了,其他的地方不能再用这个名字来作为变量名或对象名

static
简单来说static修饰变量,就是指该变量空间独立于函数中的auto变量或者栈变量,static变量空间在内存中的静态区分配。
1.修饰局部变量
在用static修饰局部变量后,该变量值在初次运行时进行初始化工作,且只进行一次。
#include<stdio.h>
void fun()
{
static int a=1;a++;
printf("%d\n",a);
}
int main(void)
{
fun();
fun();
return 0;
}  程序执行的结果为 2 3
说明在第二次调用fun()函数时,a的值为2,并且没有进行初始化赋值,直接进行自增运算,所以得到的结果为3.
对于静态局部变量如果没有进行初始化的话,对于整型变量系统会自动对其赋值为0,对于字符数组,会自动赋值为“\0”
2.修饰全局变量
对于一个全局变量,它既可以在本源文件中被访问,也可以在同一个工程的其他源文件中被访问(extern进行声明即可)
(1)file1.c
int a=1;
(2)file2.c
#include<stdio.h>
extern int a;
int main(void)
{
printf("%d\",a)
return 0;
}    执行结果为 1
但是如果在file1.c中吧“int a=1”改为“static int a=1”,那么在file2.c是无法访问到变量a的。原因在于用static对全局变量进行修饰改变了其作用域的范围,由原来的整个工程可见变为本源文件可见。
3.修饰函数
用static修饰函数的话,情况与修饰全局变量大同小异,就是改变了函数的作用域。
extern
extern可以修饰变量和函数,表示该变量或者函数在其他地方被定义,在这里声明使用它,这样多个源文件共享变量和函数。
1.extern变量名
在任何函数体外声明或定义变量时,不加extern可能是定义也可能是声明,编译器选择初始化的那个(最多一个地方对它进行丁初始化),如果没有初始化则任选其中一个作为定义,其他为声明,但是加extern肯定是声明如果不想让其他源文件链接到,则需要使用static
关键字。
在函数体内声明(注意是声明,在函数体内部不能定义外部变量)使用其他源文件中定义的变量时,必须使用extern关键字,因为在函数体内默认为局部变量。
2.extern函数
函数默认是外部的(在函数体内或函数体外声明一个外部函数,extern关键字均可省略),如果不想让其他源文件链接到,在函数前加static关键字。
前面提到过,编译器并不检查多个源文件共享的变量的类型是否一致,那么下面的代码是合法的。
char a[]="hello";
int mian()
{
extern int a;
printf("%x\n",a)
return 0;
}
同样,多个源文件共享函数,编译器也不会对外部函数的参数类型、参数个数和返回值类型进行检查,只要函数名相同即可。
int echo (int x)
{
return x;
}
int main()
{
extern int echo(char);
printf("%d\n",echo(255));
rentrn 0;
}
const
const是constant的简写,表示海枯石烂,恒定不变,一旦相伴,永不变"心"。只要一个变量前面用const来修辞,就意味着该变量里的数据可以被访问,不能被修改。我们其实还可以给它起个更雅的名字——readonly.

【可以将类型去掉看const修饰谁,谁的值就不能改编】

例如:
const int a=10;去掉类型int变成“const a=10”,a的值不变。

补充知识点:三者区别

1,p;
2,*p;
3,&p;

p是一个指针变量的名字,表示此指针变量指向的内存地址,如果使用%p来输出的话,它将是一个16进制数。而*p表示此指针指向的内存地址中存放的内容,一般是一个和指针类型一致的变量或者常量。
而我们知道,&是取地址运算符,&p就是取指针p的地址。等会,怎么又来了个地址,它到底和p有什么区别?
区别在于,指针p同时也是个变量,既然是变量,编译器肯定要为其分配内存地址,就像程序中定义了一个int型的变量i,编译器要为其分配一块内存空间一 样。而&p就表示编译器为变量p分配的内存地址,而因为p是一个指针变量,这种特殊的身份注定了它要指向另外一个内存地址,程序员按照程序的需要 让它指向一个内存地址,这个它指向的内存地址就用p表示。而且,p指向的地址中的内容就用*p表示。

auto
auto关键字在我们写的代码里几乎看不到,但又是无处不在的。在c代码中会出现大量的函数模块,每个模块都有其生命周期,在函数生命周期中声明的变量通常叫做局部变量,也叫做自动变量。
例如:
int fun()
{
int a=10;  //auto int a=10;
//do something
return 0;
}
 整型变量a在fun函数内声明,其作用域为fun函数内,出来fun函数,不能被引用,a变量为自动变量°也就是说编译器会在"int a=10"之前会加上auto的关键字。auto的出现
意味着当前变量的作用域为当前函数或代码段的局部变量,意味着当前变量会在内存栈上进行分配。

栈:先进后出的数据结构

register

使该变量作为一个寄存器变量,让该变量访问速度达到最快。

寄存器,缓存:速度最快,容量小,体积大,价格高

内存:速度较快,容量大,体积小,价格较低

使用寄存器变量时,注意

1.待声明为寄存器变量类型应该是CPU寄存器所能接收的类型,意味着寄存器变量是单个变量,变量长度应该小于等于寄存器长度。

2.不能对寄存器变量使用取地址符“&”,因为该变量没有内存地址。

3.尽量在大量频繁操作时使用寄存器变量,且声明的变量个数应该尽量少。

volatile

变量声明为volatile,不管值有没有变化,每次对其值访问时,都会从内存里,寄存器里读取,从而保证数据的一致。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值