一.结构体声明
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
描述复杂对象。
结构体成员可以是标量、数组、指针、结构体。
定义和初始化:
struct peo
{char namer[20];char tele[12];char sex[5];int high;
};
struct peo
{char namer[20];char tele[12];char sex[5];int high;
}p1,p2;//p1,p2是创建的变量
void print(struct peo *p1)
{printf("%s %s %s %d\n",p1->name,p1->tele, p1->sex,p1->high);
}
void pri(struct peo p1)
{printf("%s %s %s %d\n", p1.name, p1.tele, p1.sex, p1.high);
}
int main()
{struct peo p1 = {"张三","15066296762","男",181};printf("%s %s %s %d\n", p1.name,p1.tele,p1.sex,p1.high);print(&p1);pri(p1);return 0;
}
二.结构体传参
传指针节省空间 穿内容需要copy一份
函数传参的时候,参数是需要压栈的,
如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。结构体传参的时候,要传结构体的地址。
三.练习
1.下面哪个是位操作符:(A)
A.&
B .&&
C.||
D.|
2.下面代码的结果是:()
#include <stdio.h>int main()
{int a, b, c;a =5;c=++a;b=++c,c++,++a,a++;//逗号表达式,=优先级大于,b+= a++ +c;printf("a=%d b=%d c=%d\n:",a, b, c);return 0;
}
a=9 b=23 c=8
3.//写一个函数返回参数二进制中1的个数
第一种方法
int sum_1(unsigned int n)
{int count = 0;while (n){if (n % 2 == 1){count++;}n /=2;}return count;
}
int main()
{int n = 0;scanf("%d",&n);int sum=sum_1(n);printf("%d",sum);return 0;
}
第二种方法
第三种方法
n=n&(n-1)每运行一次可以去掉n最右边的0n=15 1111n-1=14 1110n=1110int sum_1( int n)
{int count = 0;while (n){n = n & (n - 1);count++;}return count;
}//判断一个数是不是2的n次方,化成二进制只有一个一
n&(n-1)==0则为2的n次方
4.求两个数二进制中不同位的个数
编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:7
int count_diff_bit(int m,int n)
{int count = 0;int i = 0;for (i = 0; i < 32; i++){if ((m >> i & 1) != (n >> i & 1)){count++;}}return count;
}
int main()
{int m = 0;int n = 0;scanf("%d %d",&m,&n);int ret = count_diff_bit(m,n);printf("%d",ret);return 0;
}
第二种方法
int count_diff_bit(int m,int n)
{int count = 0;int ret = m ^ n;//相同为0,相异为1while (ret){ret = ret & (ret - 1);count++;}return count;
}
5.打整数二进制的奇数位和偶数位
int main()
{int i = 0;int n = 0;scanf("%d",&n);for (i = 30; i >= 0; i -= 2){printf("%d",n>>i&1);}for (i = 31; i >= 0; i -= 2){printf("%d", n >> i & 1);}return 0;
}
6. D
7.<
全局变量、静态变量不初始化的时候默认值是0;
局部变量是随机值
sizeof返回的结果是size_t类型的,是无符号整型;相当于非常大的整数
8.D
9.打印X型图案
10.获得月份天数
11.KiKi想知道已经给出的三条边a,b,c能否构成三角形,如果能构成三角形,判断三角形的类型(等边三角形、等腰三角形或普通三角形)。
int main()
{int a = 0;int b = 0;int c = 0;scanf(" %d %d %d",&a,&b,&c);if (a + b > c && a + c > b && b + c > a){if (a == b && b == c){printf("等边三角形");}else if ((a == b && c != a) || (a == c && b != c) || (b == c && c != a)){printf("等腰三角形");}elseprintf("是三角形");}else{printf("不是三角形");}return 0;
}