首页 > 其他分享 >结构体初步(day15)

结构体初步(day15)

时间:2022-11-26 23:07:26浏览次数:32  
标签:char 20 name stu s1 初步 day15 printf 结构

本次学习结构体的声明以及简单的嵌套,以及结构体在栈区的存储。

结构体基础设置

实例

struct stu 
{
char name[20];
int age;
char sex[20];
};

struct cla
{
int s_num;
char c_teacher[20];
struct stu s;
};

int main()
{
stu stu_1 = { {'A','B','C'},12,{'m','a','l','e'} };
printf("%s\n", stu_1.name);
printf("%s\n", stu_1.sex);

cla cla_1 = { 1,{'W','A','N','G'},stu_1 };
printf("%s\n", cla_1.c_teacher);
return 0;
}

注意:对字符数组赋值时有两种方式

char name[20] = “zhang san” ;
char name[20] = {'z','h','a','n','g',' ','s','a','n'};

但不能使用如下语法:

char name[20];
name[20] = “zhang san” ;

或者

char name[20];
name = “zhang san” ;

或者

char name[20];
name[20] = {'z','h','a','n','g',' ','s','a','n'};

原因如下

1)编译器会将所有的字符放入一个数组首元素首字节内,但不可能放得下,只能放入最后一个字符。

2)name是数组名,在此处使用时退化为指针。该指针指向的是数组在内存中开辟的的首元素地址,将字符内容直接赋值给一个指针显然会造成错误。

具体原因仍然不明。

这里可以用strcpy函数对字符数组进行赋值

结构体初步(day15)_压栈

结构体初步(day15)_压栈_02

char name[20];
strcpy(name,"zhangsan");//注意:strcpy函数会复制字符串的终止符。


结构体存储

实例

typedef struct stu
{
char name[20];
int age;
char sex[10];

}stu;
void printf_1(stu tmp)
{
printf("name;%s\n", tmp.name);
printf("age:%d\n", tmp.age);
printf("sex:%s\n", tmp.sex);
}
void printf_2(stu* ps)
{
printf("name;%s\n", ps->name);
printf("age:%d\n", ps->age);
printf("sex:%s\n", ps->sex);
}
int main()
{
stu s1 = { "张三",12,"男"};

printf_1(s1);
printf("\n%d\n", sizeof(s1));
printf("%d\n", sizeof(s1.name));
printf("%d\n", sizeof(s1.age));
printf("%d\n", sizeof(s1.sex));
printf("\n%p\n", &s1);
printf("%p\n", &s1.name);
printf("%p\n", &s1.age);
printf("%p\n", &s1.sex);
printf_2(&s1);
return 0;
}

结果

name;张三
age:12
sex:男

36
20
4
10

000000C7811CF648
000000C7811CF648
000000C7811CF65C
000000C7811CF660
name;张三
age:12
sex:男

从上面地址信息中可以得出以下结论:

1)创建的结构体为34个字节,但在内存中申请了36个字节,也就是多出了两个空字节,原因不明

2)结构体内,各类数据的内存空间是紧密连接的,首元素与结构体对齐,也就是多余的两个空字节在末尾处

问题

两个空字节成因不明。

压栈与出栈

结构体初步(day15)_压栈_03

压栈:进入一个元素

出栈:删除一个元素

栈区内存调用

结构体初步(day15)_压栈_04

函数传参时,函数参数是需要压栈的(实参在main函数处,型参在main函数上压栈,随后型参在调用函数内压栈),当使用结构体传参时,压栈造成内存空间大量被占用,所以处理结构体的函数优先考虑指针)。

标签:char,20,name,stu,s1,初步,day15,printf,结构
From: https://blog.51cto.com/u_15862591/5889224

相关文章

  • 剑指offer——Day15 搜索与回溯算法(中等)
    Day152022.11.21搜索与回溯算法(中等)34.二叉树中和为某一值的路径自己实现用递归。递归函数的思路:首先是递归出口root==NULL时返回-1,告诉上层节点这个地方是NULL,以便......
  • 敲课本例题的第三天,今天依旧是分支结构!
    【例3-3】统计指定数量学生的平均成绩与不及格人数。输入一个非负整数n,再输入n个学生成绩,计算平均分,并统计不及格成绩的学生。#include<stdio.h>intmain(void){intcoun......
  • 数据结构学习总结
    以下内容来自网课数据结构与算法基础(青岛大学-王卓),结合一些博客作出总结,代码来自网络与一些书籍相互交流,共同进步目录数据结构基本概念与术语数据结构结构逻辑结构和......
  • 数据结构初阶--双向循环链表(讲解+类模板实现)
    带头双向链表的结构看下面的图,就是我今天要给大家分享有结构——带头双向循环链表。这里的头是不存放任何数据的,就是一个哨兵卫的头结点。用代码来表示每一个节点就是这......
  • 【数据结构】(2)顺序表和链表
    (1)线性表数据结构实际两种结构1.物理结构(内存中如何储存)2.逻辑结构(是我们想像出来的)线性表(linearlist)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使......
  • go专家编程--数据结构chan
    chan结构typehchanstruct{ qcount uint//队列中剩余元素大小 dataqsiz uint//队列大小 buf unsafe.Pointer//环......
  • 数据结构实验(五)二叉树
    6-1二叉树的遍历就是简单的遍历voidInorderTraversal(BinTreeBT){if(BT==NULL)return;if(BT->Left!=NULL)InorderTraversal(BT->Left);......
  • python实现输出文件夹的目录树结构
    最近清理QQ文件夹的时候,发现群聊图片巨TM大,就想看看群友们都发了什么怪图片但是QQ群聊图片文件夹里面的文件夹是一个套一个,靠手工copy肯定是不太行的,就写了个简单......
  • PC_机器数_定点负数的原码_补码_反码在结构上的关系
    文章目录​​预备知识​​​​模2范畴内的取反​​​​证明二进制补码规律​​​​模k同余​​​​......
  • 一文了解 Go 中的指针和结构体
    耐心和持久胜过激烈和狂热。前言前面的两篇文章对Go语言的基础语法和基本数据类型以及几个复合数据类型进行介绍,本文将对Go里面的指针和结构体进行介绍,也为后续文章做铺......