C 数据类型


C数据类型分为基本数据类型、struct(结构)类型、数组、指针、union类型、函数类型几种。


基本数据类型

C语言有下面几种基本数据类型:

  • char:1个字节长,保存一个字符。char值的范围和体系架构有关,如果char的实际类型为signed char则范围为-128 ~ 127,如果char的实际类型为unsigned char则范围为0 ~ 255。
  • signed char:1个字节长,保存一个字符。signed char值的范围为-128 ~ 127。
  • unsigned char:1个字节长,保存一个字符。unsigned char值的范围为-128 ~ 127。
  • int、signed int、signed:2或4个字节长,和体系架构有关,16位系统是2个字节长。int值的范围为-32,768 ~ 32,767或-2,147,483,648 ~ 2,147,483,647。
  • unsigned int、unsigned:2或4个字节长,和体系架构有关,16位系统是2个字节长。unsigned int值的范围为0 ~ 65,535或0 ~ 4,294,967,295。
  • short、short int、signed short、signed short int:2个字节长。short值的范围为-32,768 ~ 32,767。
  • unsigned short、unsigned short int:2个字节长。unsigned short值的范围为0 ~ 65,535。
  • long、long int、signed long、signed long int:4或8个字节长。long值的范围为-2,147,483,648 ~ 2,147,483,647或-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807。
  • unsigned long、unsigned long int:4或8个字节长。long值的范围为0 ~ 4,294,967,295或0 ~ 18,446,744,073,709,551,615。
  • long long、long long int、signed long long、signed long long int:8个字节长。long long值的范围为-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807。
  • unsigned long long、unsigned long long int:8个字节长。unsigned long long值的范围为0 ~ 18,446,744,073,709,551,615。
  • float:单精度浮点数,4个字节长。float值的范围为1.175x10-38 ~ 3.403x1038
  • double:双精度浮点数,8个字节长。double值的范围为2.225x10-308 ~ 1.798x10308
  • long double:10或16个字节长,和体系架构有关。

char也是整数类型。

下面是基本数据类型的值范围的例子。

#include <stdio.h>
#include <limits.h>
#include <float.h>

int main(int argc, const char * argv[]) {
    printf("Min char : %d \n", CHAR_MIN); // -128
    printf("Max char : %d \n", CHAR_MAX); // 127
    printf("Min int : %d \n", INT_MIN);   // -2147483648
    printf("Max int : %d \n", INT_MAX);   // 2147483647
    printf("Min long : %li \n", LONG_MIN);  //  -9223372036854775808
    printf("Max long : %li \n", LONG_MAX);  //  9223372036854775807
    printf("Min float : %e \n", FLT_MIN);   // 1.175494e-38
    printf("Max float : %e \n\t %F \n", FLT_MAX, FLT_MAX);  // 3.402823e+38 340282346638528859811704183484516925440.000000
    printf("Min double : %e \n", DBL_MIN);  // 2.225074e-308
    printf("Max double : %e \n", DBL_MAX);  // 1.797693e+308
    printf("Min long double : %LE \n", LDBL_MIN);   // 3.362103E-4932
    printf("Max long double : %LE \n", LDBL_MAX);   // 1.189731E+4932
    return 0;
}

struct类型

struct(结构)数据类型是一种由多种数据类型组成的复合类型。

下面是struct类型的例子:

#include <stdio.h>

int main(int argc, const char * argv[]) {
    struct box {
        float length;
        float width;
        float height;
    };

    struct box b = {1.0, 0.5, 0.3};

    printf("box length : %f \n", b.length); // 1.000000
    printf("box width : %f \n", b.width);   // 0.500000
    printf("box height : %f \n", b.height); // 0.300000 

    return 0;
}

数组

数组用来保存多个相同类型的数据,存储在一块连续的内存中。

下面是数组的例子:

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a[4] = {1, 2, 3, 4};
    printf("a[0] : %d \n", a[0]); // 1
    printf("a[1] : %d \n", a[1]); // 2
    printf("a[3] : %d \n", a[3]); // 4

    return 0;
}

指针

指针是一个变量,用于保存另一个变量的地址。

指针声明是在数据类型后跟空格和一个*,后面指针变量名。例如int *p;表示p是一个指针,p变量的值是一个地址,该地址中存放的值为一个整数。

下面是指针的例子:

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a = 12;
    int *p = &a;
    int b = *p;

    printf("Address of a : %p \n", &a); // 0x7fff5223eafc
    printf("p : %p \n", p);             // 0x7fff5223eafc
    printf("Address of p : %p \n", &p); // 0x7fff5223eaf0
    printf("*p : %d \n", *p); // 12
    printf("b : %d \n", b);   // 12

    return 0;
}

上面例子中&a中的&是取址操作符,&a得到变量a的地址。*p中的*是取值操作符,*p得到p中保存的地址处的值。

union类型

union类型的变量在不同的时间点可以用来保存不同类型的数据,在任一个时间点只能表示union中不同数据类型中的一种数据类型。

下面是union的例子:

#include <stdio.h>

int main(int argc, const char * argv[]) {
    union height {
        int i;
        float f;
    } h;

    h.i = 1234567890;
    printf("h.i : %d \n", h.i); // 1234567890
    printf("h : %d \n", h);     // 1234567890
    h.f = 1.8;
    printf("h.f : %f \n", h.f); // 1.800000
    printf("h : %f \n", h);     // 1.800000 

    return 0;
}

函数指针

函数指针使用一种特殊的签名引用函数。

下面是函数指针的例子:

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int (*pputchar)(int) = &putchar;

    pputchar(65); // A
    pputchar(49); // 1

    return 0;
}

上面例子中,int (*pputchar)(int) = &putchar;用于将putchar函数的地址保存到pputchar函数指针变量中。函数指针和函数的使用方法一样。