JNI基础 -- C++基础知识(结构体&共用体 )

结构体

类似于Java中的Bean对象,可以将一些变量封装为一个结构体
声明结构体的关键字是struct,也可以通过typedef别名定义
举个栗子:

struct Student
{
    //不同的数据类型可以声明在一个结构体中
    int age;
    short j;
};


int main()
{
    //结构体的使用
    struct Student student;
    student.age = 10;
    return 0;
}

还有一种使用结构体的简单方式,在声明结构体后面直接定义,如下:

struct Student
{ 
    int age;
    short j;
}student1,student2;//student1和student2就可以直接使用了

下面我们通过printf("结构体大小%d",sizeof(student));打印一下结构体的大小,控制台输出结果是:

结构体大小8

我们声明的两个变量,一个是int(四个字节),一个是short(两个字节),但是结构体的大小是8个字节;
原因是:在C执行的过程中,给结构体等分配内存的时候遵循内存对齐原则。

内存对齐

定义:内存对齐跟数据在内存中的位置有关。如果-一个变量的内存地址正好位于它长
度的整数倍,他就被称做自然对齐。比如在32位cpu下, 假设一个整型变量的地址为
0x00000004,那它就是自然对齐的。
内存对齐的原则有两个:

  1. 结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)
  2. 结构体大小必须是所有成员大小的整数倍,也即所有成员大小的公倍数。

所以上面Student结构体的short类型的变量分配了四个字节,只不过后面两个字节是不起作用的。所以整个结构体占用了8个字节

内存对齐的意义如图:

内存对齐

共用体

结构体和共用体表示的含义是一致的

1、定义:共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据
类型。可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。
共用体提供了一种使用相同的内存位置的有效方式。

通过union关键字声明共用体,存放不同的数据类型:

{
    int i;
    float f;
    char str[20];
};

注意:共用体占用的内存应足够存储共用体中最大的成员。例如,在上面的实例中,Data 将占用20个字节的内存空间,因为在各个成员中,字符串所占用的空间是最大的。下面的实例将显示上面的共用体占用的总内存大小:

举个栗子:

union Student
{
    int i;
    int j;
    float k;
};

int main()
{
    union Student student;
    student.i = 10;
    student.j = 22;
    printf("i的地址: %#x\n", &student.i);
    printf("j的地址: %#x\n", &student.j);
}

控制台输出结果为:

i的地址: 0x4ffb44
j的地址: 0x4ffb44

我们看到i和j的首地址是一样的,在赋值操作后打印i和j的值

 printf("i的值: %d\n", student.i);
 printf("j的值: %d\n", student.j);
//输出结果为
//i的值: 22
//j的值: 22

打印一下共用体大小:

printf("共用体大小: %d\n", sizeof(student));
//输出结果
//共用体大小: 4

你可能感兴趣的:(JNI基础 -- C++基础知识(结构体&共用体 ))