有将近两年没有摸C的代码,有点生疏了,现在通过复健顺便记录下一些重点问题.最近因为跨平台开发,所以先熟悉变量的问题.
常用变量类型及大小
C语言和其他的语言不太一样,对于细节要求的比较严格,变量定义好之后,都必须注意其大小和类型,大小错误会出现大大小小的问题,比如大小没有注意,在赋值指针变量之后,会出现对不齐的现象,而类型没有注意的话,最常见的就是printf()在输出的时候会报错.
常用的变量类型有short,int,long,longlong,char,float,double这几种除了char之外,都有无符号(unsigned)等关键字,顾名思义,无符号变量中没有负值,但是存储的内存长度和有符号变量保持一致,一般不加关键字的情况下,默认为有符号变量,他们对于不同的编译器来说,大小不尽相同,同时有可以在32/64位系统中通过sizeof()函数 查询变量大小:
#include <stdio.h>
int main()
{
printf("this is 32-bit ubuntu.\n");
printf("int is %d byte\n",sizeof(int) );
printf("char is %d byte\n",sizeof(char) );
printf("short is %d byte\n",sizeof(short) );
printf("float is %d byte\n",sizeof(float) );
printf("long is %d byte\n",sizeof(long) );
printf("double is %d byte\n",sizeof(double) );
printf("unsigned int is %d byte\n",sizeof(unsigned int) );
}
输出结果为:
this is 32-bit ubuntu.
int is 4 byte
char is 1 byte
short is 2 byte
float is 4 byte
long is 4 byte
double is 8 byte
unsigned int is 4 byte
变量名 | 长度 |
---|---|
char | 1 bytes |
int | 4 bytes |
short | 2 bytes |
long | 4 bytes |
float | 4 bytes |
double | 8 bytes |
unsigned int | 4 bytes |
指针变量
指针变量也属于变量的一种,在不同的平台下,其大小不一致,这个需要重点注意:
在32-bit系统中,总线地址为32位,内存的最大寻址范围为0~2^32(0-4Gb). 所以在32位系统中,指针变量大小一般为32-bit/4-byte.
在64-bit系统中,总线地址为64位,理论上内存最大的寻址范围变为0~2^64(), 所以在64位系统中,变量指针大小一般为64bit/8byte.
#include <stdio.h>
int main()
{
int *p;
printf("变量储存大小为%d\n",sizeof(*p) );
printf("变量指针大小为%d\n",sizeof(p) );
printf("存储变量指针地址的地址大小为:%d\n",sizeof(&p) );
}
64位系统中:
变量储存大小为4
变量指针大小为8
存储变量指针地址的地址大小为:8
32位系统中:
变量储存大小为4
变量指针大小为4
存储变量指针地址的地址大小为:4
所以在跨平台处理指针时,需要特别注意这一处.
输入和输出
C对不同类型的类型有严格的规定,每种类型都有对应的输出标志, 如果使用不当, 程序会报错, 转换说明如下:
转换说明 | 输出类型 |
---|---|
%a | 浮点数和十六进制数,p计数法 |
%A | 浮点数和十六进制数 ,p计数法 |
%c | 单个字符,char类型 |
%d | 有符号十进制整数 |
%e | 浮点数,e计数法 |
%E | 浮点数,e计数法 |
%f | 浮点数,十进制计数法 |
%g | 自动选择%f或%e |
%G | 自动选择%f或%E |
%i | 有符号十进制整数,与%d一样 |
%o | 无符号8进制整数 |
%p | 指针 |
%s | 字符串 |
%u | 无符号十进制整数 |
%x | 无符号十六进制整数,使用十六进制数0f |
%X | 无符号十六进制整数,使用十六进制数0F |
%% | 打印百分号 |
举个例子:
#include <stdio.h>
int main()
{
int *p;
int a=-10;
float b=1.1;
float f=11000.2222;
unsigned int c=100;
char d ='H';
printf("%%a:%a\n",b );
printf("%%A:%A\n",b );
printf("%%c:%c\n",d );
printf("%%d:%d\n",a );
printf("%%e:%e\n",f );
printf("%%E:%E\n",f );
printf("%%f:%f\n",f );
printf("%%o:%o\n",c );
printf("%%p:%p\n",p );
printf("%%u:%i\n",c );
printf("%%x:%x\n",c );
}
结果如下:
%a:0x1.19999ap+0
%A:0X1.19999AP+0
%c:H
%d:-10
%e:1.100022e+04
%E:1.100022E+04
%f:11000.222656
%o:144
%p:(nil)
%u:100
%x:64