结构体变量存放在内存中,也有它的起始地址,我们定义一个变量来存放这个地址,那么这个变量就是结构体指针变量;
定义 : struct 结构体类型名称 * 指针变量名;
struct player
{
int age;
char name[20];
};
void func3() {
struct player* p;
struct player kobe;
p = &kobe;
(*p).age = 33;
printf("%d
", kobe.age);
strcpy(p->name, "bra");
printf("%s
", kobe.name);
}
使用场景1:可以作为函数参数接收,结构体变量的地址
void func3_test(struct player * p) {
printf("%s
", (*p).name);
}
void func3() {
struct player meixi;
strcpy(meixi.name, "meixi");
func3_test(&meixi);
}
使用场景2:可以作为函数参数接收,结构体变量数组的地址
结构体数组的地址,就是结构体数组第0个元素的地址
struct player arr[3] = {
{31,"kobe"},
{33,"james"}
};
func3_test2(arr, 3);
void func3_test2(struct player* p,int n) {
for (size_t i = 0; i < n; i++)
{
//printf("%s
", p->name);
printf("%s
", (p[i]).name);
}
}
结构体地址与结构体第一个成员的地址一样,但是数据类型不同
struct player kobe = {
33,
"kobe"
};
printf("%p---%p
", &kobe, &kobe.age); //stu*p; int*p,指针类型不同,但是他们指向同一个地址
给结构体变量分配内存的时候,会去结构体变量中找基本类型的成员哪个基本类型的成员占字节数多,就以它大大小为单位开辟内存
在gcc 中出现了 double 类型的,例外
(I):成员中只有char型数据,以1字节为单位开辟内存。
(2):成员中出现了shont int 类型数据,没有更大字节数的基本类型数据,以2字节为单位开辟内存
(3):出现了int float没有更大字节的基本类型数据的时候,以4字节为单位开辟内存。
(4):出现了 double 类型的数据
情况 1:
在vc6.0和 Visual Studio中里,以8字节为单位开辟内存
情况 2:
在 Linux 环境gcc 里,以4字节为单位开辟内存。
规则2:字节对齐
(1):charl字节对齐,即存放char 型的变量,内存单元的编号是1的倍数即可。
(2):shont int2字节对齐,即存放short int 型的变量,起始内存单元的编号是2的倍数即可。(3):int4字节对齐,即存放int型的变量,起始内存单元的编号是4的倍数即可。
(4):longint在32位平台下,4字节对齐,即存放long int 型的变量,起始内存单元的编号是 4的倍数即可。
(5):float4字节对齐,即存放doat 型的变量,起始内存单元的编号是4的倍数即可。
(6)double
a.vc6.0和Visual Studio 环境下
8字节对齐,即存放double型变量的起始地址,必须是8的倍数,double变量占8字节
b.gcc 环境下
4字节对齐,即存放 double型变量的起始地址,必须是4的倍数,double变量占8字节。
注意:当结构体成员中出现数组的时候,可以看成多个变量。
注意:开辟内存的时候,从上向下依次按成员在结构体中的位置顺序开辟空间
结构体会在基本类型成员中,选择字节数最大的成员的字节数作为基本单位开辟空间;然后以成员需要的对齐字节来存数成员;

















暂无评论内容