以下是后面例题所涉及到的文章,如果有不会的可以点击查看
自定义类型结构体(上)
自定义类型结构体(中)
自定义类型结构体(下)
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
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,因此造成死循环。