【C语言】【unix c】数据类型

来源:互联网 发布:电脑运行网络命令大全 编辑:程序博客网 时间:2024/05/17 21:57
五、数据类型    1、什么是数据类型?        在内存中【占用】的字节数,再者就是这些数据从内存中【取出来的组织方式】             short,long,float,double,void,数组,*(指针不是地址,是一个类型,地址是指针),结构体,联合,枚举,等都是类型,他们占用存储区的大小,方式,及取出方式各有不同        例如:            char *p : 意思是定义一个指针类型(4字节)的p变量,然后在取内容时在所指的地址里取1个字节(char)的内容        举例: 编写point.c        程序:     1 #include <stdio.h>                  2                   3 int main() {                  4     int var_i = 321;                  5     char var_c = 'v';                  6     int *p;                  7     char **q;                  8     p = (int *)&var_c;                  9     q = (char **)&p;                 10     printf("*p=%d\n", *p);                 11     printf("**q=%d\n", **q);                 12     return 0;                 13 }        运行: 没有进行强制类型转换时编译后有警告,但是可以运行,        结果:   point.c: 在函数‘main’中:                point.c:7: 警告: 从不兼容的指针类型赋值                tarena@ubuntu:~/day/day23$ ./a.out                 *p=75780214                **q=118        分析: 一级指针指向字符类型的存储区,存储的是1个字节,但是在取内容时用的int类型(4个字节)(v:1110110)(以int型取出:00000100 10000100 01010000 01110110)可以看出前面多取了2个字节。 二级指针的取值方式是char的,所以取值正确.在二级指针下,p的取值方式是*(指针类型的),*p取值方式也是*(指针类型),**p的取值方式是char--------------------------------------------------------------------------------    2、指针和一维数组的关系:            int arr[3]:arr是数组常量即类型已经分配,是一个数组类型。arr是名字,这个数组里有3个元素,每个类型都是int类型的且三个元素的地址空间是连续的。            int *p=arr: p++是向后移动4个字节(也就是1int,因为*p是以int类型取值的,如果改为char *p的话,一次去1个字节)                举例:                    #include <stdio.h>                    int main() {                         int arr[3] = {1,2,3};                        char *p = arr;                        p++;                        printf("%p\n", p);                        return 0;                    }                结果:没有自增:0xbfafae40                      int下自增:0xbfc8f1b4                      char下自增:0xbf896c71            char *q=arr: q++向后移动1个字节            char *p[]; p是数组的名字,数组里的每个元素都是指针类型的即指针数组,也可以是字符串的列表--------------------------------------------------------------------------------    3、二维数组:(int[3]也是一个类型,)            int arr[2][3] = {{1,2,3},{4,5,6}};            arr[0]: 访问方式是int,每次加1移动1int型地址            arr: 访问方式是 int3,即每次加1移动3int型地址            (*(arr+1))+1:里面的1是一次移动3个,外面的一次移动1int (*p)[3]; p是指针类型的变量,p+1 向后移动3int  这是一个数组指针                int[3]是一个类型;             p = arr; p是指针类型的变量,arr是数组的名字,是常量, p+1可以,但是arr+1不可以              4、函数和指针的结合:            void *malloc(size_t size);   返回一个void *类型的地址,意思是返回一个无访问类型的地址,也就是不访问            int (*fun_t)(int,int);  *fun_t是函数指针类型的【变量】,访问方式是 intintint);即这也是一个类型            int (*fun_t[4])(int,int); (*fun_t[4])中fun_t 是数组的名字,有4个元素,每个元素都是指针类型的。这个变量遵循函数的访问方式,需要2int类型的行参和返回一个int型的值                举例:                    #include <stdio.h>                    #include <t_math.h>                    int main(void) {                        int a= 6,b = 3;                        int (*f[4])(int, int) = {t_add, t_sub, t_mul, t_div};//f是数组名,里面有4个元素,每个元素是一个指针类型的。遵循函数的访问方式,需要传入2个行参,返回一个int型的值。这里数组中的指针指向了4个函数。                        //f=t_add;                        printf("%d+%d=%d\n", a, b, f[0](a, b));                        printf("%d-%d=%d\n", a, b, f[1](a, b));                        printf("%d*%d=%d\n", a, b, f[2](a, b));                        printf("%d/%d=%d\n", a, b, f[3](a, b));                        return 0;                    }                运行:                    tarena@ubuntu:~/day/day23/tmath$ gcc t_math.c t_sul.c t_add.c                    tarena@ubuntu:~/day/day23/tmath$ ./a.out                     6*2=12                    6+2=8                    6-2=4                    6/2=3    5、主机字节序        数据的高字节存放在内存的低地址中:大端。网络通信中大部分产用大端,pc中大部分是小端            c程序判断:                #include <stdio.h>                int am_little_endian ()                {                    unsigned short i=1;                    return (int)*((char *)(&i)) ? 1 : 0;                }                int main()                {                    if(am_little_endian())                    {                        printf("本机字节序为小段序!\n");                    }else                    {                        printf("本机字节序为大段序!\n");                    }                    return 0;                }
原创粉丝点击