二级C语言关于结构体的题目

2.设有以下说明和定义语句,则下面表达式中值为3的是。
struct s
{ int i;
struct s *i2;
};
static struct s a[3]={1, &a[1],2,&a[2],3,&a[0]};
static struct s *ptr;
ptr=&a[1];
A)ptr->i++ B)ptr++->I C)*ptr->i D)++ptr->i

5. 以下程序输出结果是
#include <stdio.h>
typedef union
{ long i;
int k[5];
char c;
} DATE;
struct date
{ int cat;
DATE cow;
double dog;
} too;
DATE max;
main()
{ printf("%d\n",sizeof(struct date)+sizeof(max));
}
A)25 B)30 C)18 D)8
7.下列程序中,结构体变量a所占内存字节数是。
union U
{ char st[4];
int i;
long l;
};
struct A
{ int c;
union U u;
}a;
A)4 B)5 C)6 D)8

9.若有下面的说明和定义:
struct test {
int ml; char m2;float m3;
union uu {
char ul[5];
int u2[2];
} ua;
} myaa;
则sizeof(struct test )的值是。
A)12 B)16 C)14 D)9
10.已知:
union
{ int i;
char c;
float a;
} test;
则sizeof(test)的值是。
A)4 B)5 C)6 D)7
其答案分别是D B C A A
麻烦解释一下是怎么得出的答案,5,7,9,10题都比较类似,我想知道怎么求结构体所占字节?(以及在结构体嵌套的情况下)
7,9 ,10我已经懂了,只要解释一下2,5,两题就可以了
最新回答
ヾ(≧O≦)〃嗷~

2024-11-05 06:20:52

#include <stdio.h>

#include<string.h>

struct st{

char a[15];

long b;

}; 

int main () 

{

  struct st s[111];

 long end[111];

  char t[50][14],other[14]={'333'},son[50][14],gson[50][14];

  char x[11];

  int n;

scanf("%d",&n);

getchar();

for(int i=0;i<n;i++)

{

scanf("%s%ld",s[i].a,&s[i].b);

}

for(int i=0;i<n;i++)//排序 

{

for(int j=0;j<n-1-i;j++)

{

if(strcmp(s[j].a,s[j+1].a)>0)

{

strcpy(x,s[j].a);

strcpy(s[j].a,s[j+1].a);

strcpy(s[j+1].a,x);

}

}

}

for(int i=0;i<n-1;i++)

{

for(int j=i+1;j<n;j++)

{

if(strcmp(s[i].a,s[j].a)==0&&s[i].b==s[j].b)

{

strcpy(s[i].a,other);//去名字和号码同时重复的 

s[i].b=0;

}

}

int k=0;

for(int i=0;i<n;i++)

{

if(strcmp(s[i].a,other)!=0)

{

strcpy(t[k],s[i].a);

end[k]=s[i].b;

k++;

}

}

for(int i=0;i<k;i++)

{

strcpy(son[i],t[i]);

}

for(int i=0;i<k-1;i++)//在上面的基础上再去名字重复的; 

{

for(int j=i+1;j<k;j++)

{

if(strcmp(son[i],son[j])==0)

{

strcpy(son[i],other);

}

}

}

int word=0;

for(int i=0;i<k;i++)

{

if(strcmp(son[i],other)!=0) 

{

strcpy(gson[word],son[i]);

word++;

}

}

printf("\n");

int sum=0;

for(int i=0;i<word;i++)

{

sum=0;

for(int j=0;j<k;j++)

{

if(strcmp(gson[i],t[j])==0)

{

if(sum==0)

printf("%s %ld\n",gson[i],end[j]);

if(sum!=0)

printf("%s_%d %ld\n",gson[i],sum,end[j]);

sum++;

}

}

}

return 0;

}

爺丶蕝版莮陔

2024-11-05 14:20:56

struct s
{ int i;
struct s *i2;
};
static struct s a[3]={1, &a[1],2,&a[2],3,&a[0]};
static struct s *ptr;
ptr=&a[1];
A)ptr->i++ B)ptr++->I C)*ptr->i D)++ptr->i
A选项:ptr指向的是a[1],ptr->i可表示为a[1].i,也就是2。i++运算是先用后加,所以A表达式的值为2
D选项:++ptr->i的意思是将指针ptr向后移一个元素,再取这个元素中i的值,也就是a[2].i的值3

#include <stdio.h>
typedef union
{ long i; //4字节
int k[5]; //2*5=10字节
char c; //1字节
} DATE; //DATA类型的变量将占用10字节

struct date
{ int cat; //2字节
DATE cow; //10字节
double dog;//8字节
} too; //too占用2+10+8=20字节

DATE max;
main()
{ printf("%d\n",sizeof(struct date)+sizeof(max));
sizeof()的功能是求某种数据类型或某个变量所占字节数
struct data类型的数据占20个字节。max占10个字节。相加为30
}
A)25 B)30 C)18 D)8
追问
struct s *i2;和static struct s a[3]={1, &a[1],2,&a[2],3,&a[0]};static struct s *ptr;都是什么意思?而且i是几怎么知道,另外为什么a[1].i也就是2?
追答
struct s *i2的意思是定义一个指针变量i2,这个变量的类型是结构体struct s类型的.
static struct s a[3]定义了一个静态结构体类型struct s数组.数组中有三个元素,值为{}中的值.
static struct s *ptr定义了一个静态的结构体struct s类型的指针.
程序中ptr指向的是a[1]的地址.*ptr就是a[1]中的值,a[1]的值由两部分组成,即a[1].i和a[1].*i2
用ptr表示为ptr->i和ptr->*i2.
a[0].i=1
a[0].*i2=&a[1]
a[1].i=2
a[1].*i2=&a[2]
风铃鹿

2024-11-05 09:33:21

5:typedef union
{ long i;// 4字节数
int k[5];//10字节数
char c;//1 字节数
} DATE;

union 总字节数为10 ; union共同体占同一个内存区域(共享) 内存为成员内最大的内存=10

struct date
{ int cat; //2字节数
DATE cow;//10字节数
double dog;//8字节数
} too;

struct : 结构体中 各个成员占(独立)占有内存,结构体大小为各个成员的和 (2+10+8=20)

DATE max; //10字节 因为为union内成员

printf("%d\n",sizeof(struct date)+sizeof(max) // 20+10=30;
深蓝菇凉

2024-11-05 01:22:36

a=2,a的含义是(ptr->i)++
b=2,b的含义是(ptr++)->i
c的写法是错误,c的表示是*(ptr->i)
d=3,d的含义是++(ptr->i)
->的优先级最高,++和*的优先级比->低