明解C语言,对于有一定C语言基础,有需要注重细节的人来说是不错的选择。
下面记录下来,个人觉得应该注意的地方
1.
int tensu[NUMBER]; //像这样创建变量实体的声明称为定义声明
extern int tensu[]; //使用了extern的声明表示“使用的是在某处创建的tensu”。这里并没有真正创建出变量的实体,因此称为非定义声明。
了解extern的使用,推荐阅读P127
2.
顺序查找法
int search(const int vc[], int key, int no){
int i = 0;
while(1){
if(i == no) return -1;// failed
if(vc[i] == key)
return (i);
i++;
}
}
哨兵查找法
是将数组的最后一位赋值成该key,能够减少循环判断,代码简洁
int search(const int vc[], int key, int no){
int i = 0;
vc[no] = key;
for(;vc[i] != key;i++)
; //日本人很喜欢这样写,个人觉得这种写法比较好 分号单另起行 不容易出错。
return (i == no? -1 : i);
}
静态存储期
被赋予了静态存储空间的对象,会在main函数开始执行之前被初始化。因此,虽说程序执行的时候会经过static int sx = 0;,但其实那个时候
并没有进行初始化处理,也就是说该声明并未进行赋值处理。
另外,如果没有赋予初始值,则该对象会自动初始化为0。
why?
--------摘自《专业嵌入式软件开发--全面走向高质高效编程》
在程序编译后,会生成.o文件,在这个文件中 包含了.text .data .bss段和符号表等信息,而对于初始化部位0的常量,编译器会将它放入.data段中,
而对于初始化为0的变量会被放入.bss段中。实际上,没有初始化的变量也像初始化为0的变量那样被放入.bss段中。由于.bss段中存放的数据是初始化为0
或没有初始化好的,所以不需要将其内容像.data段那样存放在程序文件中。当程序被引导加载器加载以后,引导加载器将执行权交给加载程序之前,会把
.bss段所在的内存区域全部初始化为0.这就是为什么没有设置初始化的全局变量其值却总是为0的缘故。
所以,才有上文的“声明时未进行初始化处理”
p145 有一张存储器和对象的寿命图 值得理解
第七章 基本数据类型
当时学C语言时 没有仔细注意 里面的水还是比较深的
有取值范围,反码补码,进制转换,位操作,溢出,浮点操作等
1.在vs2008中
long int 和 int 的取值范围是 -2147483648 ~ 2147483647
sizeof(char) = 1
sizeof(short) = 2
sizeof(int) = 4
sizeof(long) = 4
sizeof(double) = 8
sizeof(double*) = 4
12345U 为无符号数12345
后缀为L 为long
后缀为LU 为unsigned long
如何将十进制数用二进制表示出来?
1.最简单的方式是 除2取余数
2.用移位操作
1) 先计算计算机的位数
cout_bits(~0U);
// 求出unsigned的位数
int cout_bits(unsigned x){
int count = 0;
while(x){
if(x & 1U) count++;
x >>= 1;
}
return count;
}
// 输出,显示位的内容
void prints_bits(unsigned x){
int i;
for(i = cout_bits(~0U) - 1; i>=0; i--){
putchar((x >> i)& 1U) ? '1' : '0';
}
}
main(){
prints_bits(12345U);
}
3.逻辑移位和算数移位
在执行左移和右移时,注意不要对负数进行位移(破坏符号位),也不要作超过位数的位移(无意义)
左移no位时,如果一个数是无符号整数型,那么运算结果就相当于这个数乘以2的no次方
右移no位时,如果一个数是无符号整数型,那么运算结果就相当于这个数除以2的no次方所得的商的整数部分
逻辑位移不考虑符号位,所有的二进制位都参与位移,填0 (左移和右移一样)
算数位移考虑符号位,保留最高位的符号位,只有其他位会做位移。
还维持“左移一位,值变为原来的两倍;右移一位变为原来的二分之一”的规则
所以左移时,符号位不动,填0
右移时,根据符号位是什么就填什么
4. 65535加1的结果为0,即循环使用0--最大值。
5. 有符号整形和无符号整形
将有符号整形转换为位数相同或位数更多的无符号整数时,如果该有符号整数不为负数,则数值不会发生变化。
否则,若无符号整数的位数较大,则先将有符号整数提升为与无符号整数长度相同的有符号整数。然后再与无
符号整数类型可表示的最大数加1后的值相加,将有符号整数转换为无符号整数。
如图:
将整数类数据类型转换为位数更少的无符号整数时,除以比位数较少的数据类型可表示的最大无符号数大1的数,所得的非负余数就是转换后的值。
如图:
将整数类数据类型转换为位数更少的有符号整数时,以及将无符号整数转换为位数相同的有符号整数时,如果不能正确表示转换后的值,则此时的操作由编译器定。
6. 注意宏定义的展开
第九章 字符串
注意:
char pa[] = "abc\0def";
sizeof(pa) = 8; //但是输出时 截取成abc
sizeof("abc\0def") = 8;
printf("abc\0def"); //输出abc
char *p = "abc\0def";
sizeof(p) = 4; //指针大小为4
1. printf("%-8s", str); // 如果设置了—标志,则表示左对齐,否则表示右对齐(空白部分填补空格)
2. 除了初始化赋值的时候,我们不能将数组的初始值或字符串直接赋予数组变量
char str[4];
str = {'a','a','a','\0'}; // not ok
str = "aaa"; // not ok
2. 熟悉字符串复制方法
char *strcpy(char *s1, const char *s2){
char *temp = s1;
while(*s1++ = *s2++) // 当s1为0时退出循环
;
return temp;
}
3.字符串转换函数
int atoi(const char *str) // 将字符串转换为int型
float atof(const char *str) // 将字符串转换为浮点型
long atoi(const char *str) // 将字符串转换为long型
第十三章 文件和流
表示标准流的stdin,stdout,stderr都是指向FILE型的指针
c语言实现16进制文件读取
http://xiabin1235910-qq-com.iteye.com/blog/1883534
c语言复制二进制文件
http://xiabin1235910-qq-com.iteye.com/blog/1883532
C语言逐行读取文件内容
http://xiabin1235910-qq-com.iteye.com/blog/1883219
以上其他重点之处,已经通过图片的方式呈现,不加赘述。。
相关推荐
《明解C语言 代码.zip》是一个包含C语言编程示例的压缩文件,名为"my_resource"。这个压缩包很可能是为了帮助初学者或者开发者更好地理解C语言的基础概念和编程技巧而提供的。C语言是一种强大的、低级的编程语言,被...
C语言基础知识点总结 在本资源中,我们将详细介绍C语言的基础知识点,涵盖变量、数据类型、运算符、控制流、函数等方面的内容。 变量和数据类型 在C语言中,变量是存储数据的容器。变量有不同的数据类型,例如...
思考快你一步——用编程轻松提升逻辑力》和《超萌C语言入门》等书籍注重逻辑思维的培养,而《明解C语言第3版入门篇》等则可能更加注重对C语言编程的深入讲解和实例演示。 整体来看,这部分内容旨在帮助初学者巩固...
- 对于密文中每个字符,根据对应位置的密钥字符反向偏移,从而得到明文中的相应字符。 - 最终输出明文。 #### 三、代码解析 本段代码实现了维吉尼亚密码的加密和解密功能。 ##### 1. 加密函数 `encryption()` ...
例如,如果明文中的某个字符为\(P\),密钥中的对应字符为\(K\),那么加密后的字符\(C\)可以通过以下公式计算得出: \[ C = (P + K) \mod 26 \] 其中,\(P\)和\(K\)均转换为0-25之间的数字(A=0, B=1, ..., Z=25...
- 解密过程与加密过程类似,不同之处在于,此处需要计算密文与密钥之间的差值来恢复原始明文。 - 同样地,如果遇到非字母字符,则直接将其复制到明文字符串中。 3. **`main` 函数**:这是程序的入口点,负责读取...
#### 五、总结 通过以上分析,我们可以看出维吉尼亚密码通过引入密钥机制大大提高了加密的安全性。在实际应用中,合理选择密钥长度并结合其他加密手段可以使加密效果更佳。此外,该C语言实现提供了一个基本框架,...
本讲内容围绕C语言中的循环嵌套结构进行讲解。首先,从一个找茬游戏开始,通过一段..."明解C语言第3版入门篇"则是一本专注于教授C语言的入门书籍。这些资源为学习者提供了全方位的视角,帮助他们构建完整的知识体系。
- **编写背景**:自1995年起,作者唐蔼明与谢泉钦开始担任计算机应用专业及电子专业的《C程序设计》课程的教学工作。在此过程中,他们注重收集和整理相关的例题和算法,并在课堂上进行了深入浅出的讲解,受到了学生...
在进行线性密码分析时,通常会寻找输入和输出之间的线性关系,构建出近似的线性方程,然后利用统计方法收集大量明密文对,以检验这些方程的有效性。如果成功,可以揭示出密码算法的部分内部状态,从而可能削弱其安全...
总结 本文提出了一种改进的非对称加密算法,通过对明文中的关键信息进行特殊加密并混淆,大大增强了加密系统的安全性。这种方法通过多层加密和混淆技术的应用,有效地提高了加密的强度,对抗了常见的加密攻击。虽然...
#### 四、总结 本文介绍了两种古典加密算法——置换密码和代换密码,并通过示例代码进行了具体说明。虽然这些加密方法在现代加密领域已经被更为先进的技术所取代,但了解它们的工作原理对于理解加密技术的发展历程...
`:根据密文和密钥计算明文中的一个字符。 - `char* decrypt(char* ciphertext, char* key);`:解密函数。 - `void decrypt_file(char* filename, char* key);`:解密文件内容。 2. **实验结果展示**:实验报告中...
例如,在提供的C语言代码示例中,用户输入一段明文和一个密钥,程序会根据密钥对明文字符进行加法运算,超过字母表范围的字符会回绕到字母表的开头。这种方法简单易行,但在现代密码学标准下安全性较低,因为容易受...
在IT领域,加密技术是确保数据安全的关键环节之一。本文将深入探讨两种经典的加密算法——RSA和Vigenere Cipher,并通过分析给定的代码片段来理解Vigenere Cipher的实现原理。 ### RSA加密算法 RSA是一种非对称...
加法密码是最简单的密码学示例之一,它通过将明文中的每个字母按字母表顺序向后(或向前)移动特定数量的位置来加密。例如,如果密钥是3,那么"A"会变成"D","B"会变成"E",以此类推。解密过程则是相反的操作,即...
#### 总结 通过本次实验,我们深入了解了替代密码的工作机制以及其实现方式。虽然这种加密方式相对简单且易于破解,但它仍然是学习密码学基础知识的重要一环。未来的信息安全学实验中,我们将进一步探讨更复杂、更...
根据给定文件的信息,我们可以总结出以下关于“单表替换加密解密C程序”的相关知识点: ### 一、单表替换加密技术概述 单表替换(也称为简单替换)是一种基本的加密方法,它通过将明文中的每个字符替换成另一个...
libpng库通过一组清晰的C语言API接口提供服务,这些接口允许开发者控制图像处理的各个阶段,包括读取和写入PNG头部信息、处理调色板、处理IDAT块等。 4. **内存管理** libpng-1.5.0beta15版本改进了内存管理,...