C程序设计(第五版)

您所在的位置:网站首页 windows程序设计pdf第七版 C程序设计(第五版)

C程序设计(第五版)

2023-06-18 21:48| 来源: 网络整理| 查看: 265

文章目录 前言第2章 运算符与表达式以及运算优先级赋值算术关系逻辑逗号条件 第3章 顺序程序设计第4章 选择结构程序设计c逻辑运算 第5章 循环程序设计第6章 利用数组处理批量数据第7章 用函数实现模块化程序设计第8章 善于利用指针第9章 用户建立数据类型结构体字节对齐 第10章 对文件的输入输出1、问题:结构数组student中的元素都已有值,若要将这些元素写入到硬盘文件fp中,应该怎么写入,有多少种方式?

前言

鉴于写CSDN博客一篇一篇查找比较麻烦,所以特此把这些按照分类别成一个目录,后面把这些问题、知识点写到相关目录的下面,根据目录查找,复习,这个C语言系列就写到这篇上面了。后面如果写得太多,一篇博客写不完就把链接放到下面查找。

第2章 运算符与表达式以及运算优先级 赋值 算术 关系 逻辑 逗号 条件 #include int main(int argc, char **argv) { int a = 1,b=4,c=3,d=2,e; e=a int a=4,b=5,c=0,d; d = !a && !b||!c; printf("%d\n",d); } //为什么是1?不是0?这里会我们会错误地认为&&左边为0,&&后面的就不算了,所以会误以为d为0. 因为在表达式!a && !b||!c中,&& 的优先级高于 ||,所以实际上这个表达式相当于 (!a && !b) || !c。而因为 a 和 b 都是非零值,所以 !a && !b 的结果为 0,而 !c 结果也为1。最后,0 或 1 的结果总是1,因此 d 的值为1。

在这里插入图片描述

第5章 循环程序设计 #include int main(int argc, char **argv) { int p[8]={11,12,13,14,15,16,17,18},i=0,j=0; while(i++ int n, i; printf("please enter an integer number, n = ?"); // 提示用户输入一个整数 scanf("%d", &n); int limit = (int) sqrt(n); // 计算根号n for (i = 2; i "a","bc","def"};矩阵 c 存储如下: a b c d e f char c[3][3] = {"a", "bc", "def"},矩阵 c 存储如下: a \0 \0 b c \0 d e f 第7章 用函数实现模块化程序设计 第8章 善于利用指针 第9章 用户建立数据类型 结构体 struct sk{ int a; float b; }data, *p = &data; (1)(*p).data.a ? (2) (*p).a? (3)p->data.a ? (4)p.data.a ?

(*p).data.a:这个表达式尝试使用 (*p) 运算符先解引用指针 p,然后再使用成员访问运算符 . 访问 data 字段,最后使用 .a 访问结构体 data 中的成员 a。然而,data 结构体本身并没有名为 data 的字段,因此这个表达式是错误的。

(*p).a:这个表达式也使用 (*p) 运算符先解引用指针 p,然后使用成员访问运算符 . 访问 a 字段。这是正确的方法之一,用于访问结构体 data 中的成员 a。

p->data.a:这个表达式使用箭头运算符 -> 直接从指针 p 中访问结构体 data 中的成员 a。箭头运算符会自动进行指针解引用和成员访问操作。因此,这也是正确的方法之一,用于访问结构体 data 中的成员 a。

p.data.a:这个表达式是错误的。因为 p 是一个指针,使用点运算符 . 来访问结构体成员需要对指针进行解引用。这里应改为 (*p).a 或 p->a 来访问结构体 data 中的成员 a。

正确的两种方法是 (*p).a 和 p->a。这两个表达式都能正确访问结构体 data 中的成员 a。

字节对齐

点击跳转详见博主棉花糖超人【C上分之路】第八篇:结构体声明定义、结构体数组以及字节对齐 1、按一个字节对齐; 2、按编译器默认进行对齐; 3、字节对齐规则: (1)结构体内部任何K字节的基本对象相对于结构体首地址的偏移,必须是K的整数倍 (2)结构体变量的首地址能够被其最宽基本类型成员的大小所整除 (3)结构体的总大小为结构体最宽基本类型成员大小的整数倍

struct stu{ union{ char a[5]; int b[2]; }_class; char c[8]; float d; }lk; 若int为2字节,char 1 float 4 ,Find sizeof(lk)?

根据结构体内存对齐的规则,对于这个结构体的大小 sizeof(struct stu) 的计算如下:

char a[5] 占用 5 个字节。

int b[2] 占用 2 个 int类型大小的字节,因为 int 在题中定义为 2 个字节大小,所以 int b[2] 总共占用 4 个字节。

char c[8] 占用 8 个字节。

float d 占用 4 个字节。

所以,这个结构体的总大小为 5 + 4 + 8 + 4 = 21 个字节,即 sizeof(struct stu) 的值为 21

第10章 对文件的输入输出

结构体指针获取结构体成员

通过结构体指针获取结构体成员的方式 1、(*ptr).structMember 2、ptr->structMember .运算符高于*,所以(*ptr)括号不能少 1、问题:结构数组student中的元素都已有值,若要将这些元素写入到硬盘文件fp中,应该怎么写入,有多少种方式? struct st{ char name[8]; int num; float s[4]; }student[50]; 1、fwrite(student, sizeof(struct st), 50, fp);//√ 2、fwrite(student, 50 * sizeof(struct st), 1, fp);//√ 3、fwrite(student, 25 * sizeof(struct st), 25, fp);//x //写入的数据超过实际的数组数据,可能造成文件大小不正确或写入了无效的数据,正确写法应为把第三个参数修改为2. 4、for (i = 0; i fwrite(&student[i], sizeof(struct st), 1, fp); // 逐个写入结构体 } fclose(fp); // 关闭文件

该方法通过循环逐个写入结构体数组 student 中的每个元素,每个元素的大小为 sizeof(struct st),写入的数据个数为 1。

方法2: 批量写入所有结构体

FILE *fp = fopen("filename.txt", "wb"); // 打开文件 fwrite(student, sizeof(struct st), 50, fp); // 批量写入所有结构体 fclose(fp); // 关闭文件

该方法通过一次性写入整个结构体数组 student 到文件中,每个元素的大小为 sizeof(struct st),写入的数据个数为 50。

方法3: 通过指针进行写入

FILE *fp = fopen("filename.txt", "wb"); // 打开文件 // 将指针指向结构体数组的第一个元素,然后写入整个结构体数组 fwrite(student, sizeof(struct st), 25, fp); fclose(fp); // 关闭文件

该方法利用指针将结构体数组 student 的前 25 个元素作为整体进行写入,每个元素的大小为 sizeof(struct st),写入的数据个数为 25。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3