1.将指针指向结构体,对指针取内容,利用指针将结构体整体进行交换。
#include <stdio.h>
#include <string.h>
typedef struct{
int num;
char name[20];
char sex;
float score;
}Mem;
Mem boy[6]={{101,"li ping",'m',45},
{102,"zhang ping",'m',62.5},
{103,"he fang",'m',92.5},
{104,"cheng ling",'f',87},
{106,"wang ming",'m',58}};
Mem *p=boy;
void fail_mem(Mem *a,int n)
{
int i,count=0;
for(i=0;i<n;i++)
{
if((*(p+i)).score<60)
count++;
}
printf("不及格人数为%d\n",count);
}
void print_allmem(Mem *a,int n)
{
int i;
*(a+n-1)=*(a+n-2);//这里直接将结构体当做一个整体进行交换
*(a+n-2)=*(a+n-3);
(*(a+n-3)).num=105;
strcpy((*(a+n-3)).name,"ma li");
(*(a+n-3)).sex='f';
(*(a+n-3)).score=20;
for(i=0;i<n;i++)
printf("%d %s %c %f\n",(a+i)->num,(a+i)->name,(a+i)->sex,(a+i)->score);
}
void print_others(Mem *a,int n)
{
Mem temp={0};
printf("\n");
int i;
*(a+4)=temp;
for(i=0;i<n;i++)
printf("%d %s %c %f\n",(a+i)->num,(a+i)->name,(a+i)->sex,(a+i)->score);
}
int main()
{
fail_mem(p,6);
print_allmem(p,6);
print_others(p,6);
return 0;
}
2.声明并定义一个枚举变量,该变量充当结构体成员。值得注意的是,枚举内部成员之间用逗号隔开,且被系统从0开始付初值。
#include <stdio.h>
#include <string.h>
typedef struct{
enum {
eint,
efloat,
estr
}kind;//声明并定义一个枚举变量,该变量充当结构体成员。值得注意的是,枚举内部成员之间用逗号隔开,且被系统从0开始付初值
union{
int a;
float b;
char s[20];
};//联合体的变量可以省略,内部成员可直接充当结构体成员
}Type;
void print(Type msg)
{
switch(msg.kind)
{
case eint:
printf("%d\n",msg.a);
break;
case efloat:
printf("%f\n",msg.b);
break;
case estr:
printf("%s",msg.s);
break;
default:
break;
}
}
int main()
{
int i;
Type msg[3];
msg[0].kind=eint;
msg[0].a=123;
msg[1].kind=efloat;
msg[1].b=1.23;
msg[2].kind=estr;
strcpy(msg[2].s,"helloworld");
for(i=0;i<3;i++)
print(msg[i]);
return 0;
}
3.在地址的位上进行操作,实现从高位向低位的打印。x*2^位数,代表向左移动相应位数后的值,且后空余位置补0。x/2^位数,代表向右移动相应位数的值,且最高位若为1则左补1,为0则补0.
#include <stdio.h>
int main()
{
unsigned int a=456,b=0x1<<31;
for(i=0;i<32;i++)
{
a&b?putchar('1'):putchar('0');
a<<=1;
}
return 0;
}