初识结构体;
创建结构体类型;
1.结构体是一个不一定相同类型元素的集合;
2.声明里面的内容;后面如果加了变量名,表示创建了该类型的变量;
3.代码:
struct student {
char name[10];
int age;
double height;
char sex[5];
} s2,s3,s4;
结构体嵌套及访问;
1.先创建一个结构体,再创建一个结构体,在里面嵌套上一开始创建的结构体,并进行初始化;
2.运用 . 操作符进行一层或多层访问;
3.代码:
struct s
{
int* dizhi;
int length;
};
struct s bin = { NULL,20 };
struct student {
char name[10];
int age;
int height;
char sex[5];
struct s bin;
};
//
int main()
{
struct student snake = { "san",18,178,"male",{NULL,20} };
printf("%s %d %d %s %p %d\n", snake.name, snake.age, snake.height,snake.sex, snake.bin.dizhi,snake.bin.length );
return 0;// .可以多次访问;
}
4.运行结果;
‘.’ 操作符和->操作符;
1. '.'操作符前面是变量;->操作符前面是指针;
2.代码:
struct student {
char name[10];
int age;
int height;
char sex[5];
};
int main()//在c语言中没有对结构体类型进行typedef,不能省略关键字;
{
struct student s1 = { "zhang",19,1.80,"fem" };//这是的按照结构体定义顺序来写;
struct student s2 = { .age=18,.height=1.79,.sex="cant",.name="xiba"};//不用按照结构体定义顺序;
printf("%lf %d %s %s\n", s1.height, s1.age, s1.name, s1.sex);//不用按照顺序打印;
printf("%s %d %lf %s\n", (&s1)->name, (&s1)->age, (&s1)->height, (&s1)->sex);
//这是访问结构体的两种方式;
return 0;
}
3.运行结果;
操作符类型题目;
得到一个数中1的个数;
法一:按位与1;
1.利用移位操作符和与操作符来判断最后一位是不是1,并使用计数器来记录;
2.代码:
#include<stdio.h>
int cunt1(int n)
按位与1
{
int i = 0;
int count = 0;
for (i = 0; i < 32; i++)
{
int x = 1 & (n>>i);
if (1 == x)
{
count++;
}
}
return count;
}
法二:模2除2;
1.先模2,只要是奇数,最后一位肯定是1,计数器加1;再除2,去掉最后一位,相当于向前移;
2.如此循环,一直到n=0,返回计数器内容;
3.代码:
int cunt1(unsigned int n)
{
int count = 0;
while (n)
{
if (1 == n % 2)//只要是奇数,最后一位肯定是1
{
count++;//负数也当无符号数来处理;
}
n = n / 2;//去掉最后一位,相当于往前移;
}
return count;
}
法三:n&(n-1);
1.n&(n-1)会让最右边的1去掉,直到n变成0,去掉1的个数就是这个数1的个数;
2.代码:
#include<stdio.h>
int cunt1(int n)//有几个1数几次,效率最快;
{
int count = 0;
while (n)
{
n = n & (n - 1);
count++;
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
int back = cunt1(n);
printf("%d个1\n", back);
return 0;
}
3.运行结果;
判断一个数是不是2的幂次方;
1.如果数是2的幂次方那么他的二进制只有1位;
2.n&(n-1)会去掉最右边的1,如果是二的幂次方,则n变成0;
3.代码:
#include<stdio.h>
void istwo(int n)
{
if (n <= 0)
{
printf("%d不是2的幂次方\n", n);
}
else
{
int z = n & (n - 1);
if (0 == z)
{
printf("%d是2的幂次方\n", n);
}
else
{
printf("%d不是2的幂次方\n", n);
}
}
}
int main()
{
int n = 0;
scanf("%d", &n);
istwo(n);
return 0;
}
4.运行结果;
求两个数中不同位的个数;
1.先求两个数的异或;在算出异或结果里1的个数;
2.代码:
#include<stdio.h>
int count(int x)
{
int count = 0;
while (x)
{
x = x & (x - 1);
count++;//可以设置断点条件使得条件成立才触发断点
}
return count;
}
int main()
{
int m = 0;
int n = 0;
scanf("%d%d", &m, &n);
int ret = m ^ n;
int back=count(ret);
printf("%d个不同位\n", back);
return 0;
}
3.运行结果;