结构体基础例题


感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 C语言
🐿️🐿️🐿️ C语言例题
🐣🐓🏀 python

以下是后面例题所涉及到的文章,如果有不会的可以点击查看
自定义类型结构体(上)
自定义类型结构体(中)
自定义类型结构体(下)

例题一

struct student
{
  int num;
  char name[32];
  float score;
}stu;

A.struct 是结构体类型的关键字
B.struct student 是用户定义的结构体类型
C.num, score 都是结构体成员名
D.stu 是用户定义的结构体类型名

例题解析

struct student是一个独一无二的结构体类型,而每个结构体都必须要有一个struct来作为一个关键字

结构体的成员就是结构体括号内num score(name[32]是结构体变量)

对于用户定义的结构体类型名,我们需要用到typedef,这里的stu其实是定义的结构体的类型变量

答案

答案 D

例题二

结构体访问成员的操作符不包含:( )
A. . 操作符
B -> 操作符
C * 解引用操作符
D sizeof

例题解析

注意这里是结构体访问成员的操作付,是访问成员

.操作符是结构体类型变量访问结构体中成员时

->操作符是指向结构体类型变量的指针访问结构体中成员时,就是通过找到地址去访问

指向结构体类型变量的指针也可以通过.方式访问成员,只不过要先通过*对该指针解引用

对于sizeof虽然是操作符,但是并不是访问成员的操作符

答案

答案 D

例题三

下面程序要求输出结构体中成员a的数据,以下不能填入横线处的内容是( )

#include < stdio.h >
struct S
{ 
  int a;
  int b; 
};
int main( )
{ 
  struct S a1, *p=&a1;
  a1.a = 99;
  printf( "%d\n", __________);
  return 0;
}

A.a1.a
B.*p.a
C.p->a
D.(*p).a

例题解析

这道题关键就是在于符号的优先级,下面是关于优先级顺序的图片
在这里插入图片描述
在这里插入图片描述
对于a1.a,a1是结构体类型变量,因此a1.a其实就是结构体成员a

对于*p.a,这里就需要用到优先级了,*操作符的优先级是低于.操作符的,所以 * p.a其实可以这样写成 * (p.a),显然是有问题的

p->a就是通过找到地址去访问结构体成员a

(*p).a其实就是等价于(a1).a

答案

答案 B

例题四

下面程序的输出结果是:( )

struct stu
{
    int num;
    char name[10];
    int age;
};

void fun(struct stu *p)
{
	printf("%s\n",(*p).name);
	return;
}

int main()
{
	struct stu students[3] = {{9801,"zhang",20},
							  {9802,"wang",19},
                              {9803,"zhao",18}};
   fun(students + 1);
	return 0;
}

A.zhang
B.zhao
C.wang
D.18

例题解析

这道题有点类似于二维数组,如果对二维数组不是很理解的可以看一下我之前写的一篇文章C语言深入理解指针(非常详细)(四)

struct stu
{
    int num;
    char name[10];
    int age;
};

结构体成员包括以下成员,int num,char name[10],int age

int main()
{
	struct stu students[3] = {{9801,"zhang",20},
							  {9802,"wang",19},
                              {9803,"zhao",18}};
   fun(students + 1);
	return 0;
}

这里的struct stu students[3]就是将结构体看成一个二维数组,二维数组的第一行为{9801,“zhang”,20},第二行为{9802,“wang”,19},第三行为{9803,“zhao”,18}

每一行有三个元素,我们以第一行为例,第一行的第一个结构体成员为int类型的9801,第二个结构体成员为一个字符数组的字符串"zhang",第三个结构体成员为int类型的20

fun(students+1)的students是这个二维数组的数组名,也就是首元素的地址,students+1就是第二行的地址,也就是{9802,“wang”,19}

void fun(struct stu *p)
{
	printf("%s\n",(*p).name);
	return;
}

最后这里打印的是(*p).name就是第二行的字符数组的字符串"wang"
在这里插入图片描述

答案

答案 C

例题五

喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水(编程实现)

例题解析及答案

这道题其实很多人之前应该都听说过,当时记得有人说如果最后只剩一空瓶子就找老板先要一瓶汽水,然后喝完后再把两个空瓶子给他,这样就可以白嫖一瓶汽水

如果是这样的话我们最后需要用到一个if的判断语句,如果最后剩一个空瓶子就先要一瓶汽水,最后再把两个空瓶子还回去

我们从题目中可以很明显的看出这是一个等比数列,假设我们先将全部钱都花光买汽水,最后将汽水都喝完,然后去换,因为是两个空瓶换一瓶汽水,所以只需要对买的汽水总数都除2就行了,然后喝完后又去换,直到最后没有空瓶子

int main()
{
	int bottle = 20, count=20;
	while (bottle != 0)
	{
		if (bottle %2== 1&&bottle!=1)
		{
			count = count + 1;
		}
		if (bottle == 1)
		{
			count = count + 1;
			break;
		}
		bottle = bottle / 2;
		count = count + bottle;
	}
	printf("%d", count);
		
	return 0;
}

if (bottle %2== 1&&bottle!=1)是为了判断空瓶子是奇数还是偶数,如果是奇数并且不等于1的话我们只需要对喝的瓶子总数加1即可,因为整个循环中我们后面会对bottle总数除2,然后count加上bottle剩余的数量
在这里插入图片描述

在这里插入图片描述

例题六

VS开发环境调试下面的代码,画图解释下面代码的问题

#include <stdio.h>
int main()
{
    int i = 0;
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    for(i=0; i<=12; i++)
    {
        arr[i] = 0;
        printf("hello bit\n");
    }
    return 0;
}

例题解析及答案

答案解析:
以下代码有两个问题:1. 数组访问越界   2. 死循环
 以下代码在vs2013下会造成死循环,原因:
 栈内存:
         |CC  CC  CC  CC|
         arr[0]|01  00  00  00|\
         arr[1]|02  00  00  00| \
         arr[2]|03  00  00  00|  \
         arr[3]|04  00  00  00|   \
         arr[4]|05  00  00  00|    \
         arr[5]|06  00  00  00|    /  arr的空间
         arr[6]|07  00  00  00|   /
         arr[7]|08  00  00  00|  /
         arr[8]|09  00  00  00| /
         arr[9]|0A  00  00  00|/
               |CC  CC  CC  CC|
               |CC  CC  CC  CC|
               |00  00  00  00| i的空间
               |CC  CC  CC  CC|
for循环中,i的内容是从0,一直增加到12,而数组只有10个空间,因此会越界
每次访问arr数组i号位置时,都会将该位置内容设置为0,当访问到arr[12]时,也会将该位置内容设置为0,而位置恰好为i的位置,即a[12]恰巧将i设置为0,因此造成死循环。
  • 76
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 52
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 52
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值