1.数组使用scanf输入时也需要注意是否需要使用取地址符号(如果只是数组单元a的话就不需要使用&,如果是数组里的值a[1]则需要使用&)
2.注意/2和/2.0是不一样的
其实只要相除的两个数中有一个是浮点数的话就会进行浮点数除法,如果都不是浮点数的话,就会进行整数除法(就是小数部分直接丢弃)
3.可以在main()函数外面定义全局变量(这样才能正确的进行调试,添加查看的结果才能正确)
1.int chu(int a,int b)数据类型要记得写(即使原来已经有声明过了,也要写(因为形参和实参是不同的))
2.在C语言中写函数,(有两种形式,第一种在main函数前面先声明,然后在main函数后面再定义函数具体内容;第二种在main函数前面就直接定义函数具体内容)
3.使用scanf来输入时,如果在双引号里面有很多个空格的话不需要真的输入那么多个空格
1.return (1)也不会报错,只需要是输出一个值就行
2.for循环小括号中是先执行前面两个条件,然后等该步循环结束以后程序再执行第三个条件,接着重新进入前面两个循环的判断
3.printf("%5d",j);
5的作用(宽度修饰符) 前面的5是宽度修饰符。它指定了输出的**最小**宽度为 5 个字符位置。 当要输出的整数的实际位数小于 5 时,会在整数前面填充空格,以达到最小宽度要求。 例如,如果j = 3,那么printf("%5d",j);会输出 3(这里3前面有 4 个空格,总共占 5 个字符的位置)。 如果要输出的整数的实际位数大于或等于 5,那么该整数会按实际位数输出,不会截断。例如,如果j = 12345,那么printf("%5d",j);会输出12345。
for(l=1;l<=i;l++,j++) printf("%5d",j);
逗号运算符,后面的才是真的输出,前面的那个表达式只是参与运算
5.在函数中传参(数组)不能在中括号中写入具体数据
1.实型通常就是浮点数据类型,用于表示实数,即有带小数点的数值
2.putchar()如果想要显示在命令窗口中,需要在小括号里面写入显示的东西
3.sizeof
如果操作数是一个变量名或数组名,可以省略小括号。这时合法的
4.\0
当在C语言中使用%s
格式符进行输入时,计算机会自动在输入的字符串末尾添加\0
(空字符)
5.for循环可以自己写一行,然后啥内容也没有
示例: for(i = 0; s[i] != '\0'; ++i); 可以用于记录字符串的长度等等
6.其实文本操作的函数也就是正常的函数然后在最前面加上一个f
但是又有点不一样 例如:scanf在终端是输入函数,而fscanf在文本操作中是读出函数
7.FILE为当前文件执行代码常量
8.fprintf是用于把东西存储到其他文件的函数
1.while和do-while
一.while #include int main() { int i = 0; // 使用while循环,在循环开始前检查条件 while (i < 5) { printf("当前数字是:%d\n", i); i++; } return 0; } 结果:i的值最后为5 二.do-while #include int main() { int i = 5; // 使用do-while循环,至少执行一次循环体,然后再检查条件 do { printf("当前数字是:%d\n", i); i++; } while (i < 5); // 注意,这里的条件初始时是不满足的 return 0; } 结果:i的值最后为6
2.C语言数据类型总结
一、基本数据类型 整型(Integer Types) int:通常占用4个字节,能表示的数值范围大致在[-2147483648, 2147483647]。2^31 short:占用的存储空间比int少,一般为2个字节,能表示的整数范围是[-32768, 32767]。2^15次方 long:用于需要更大数值范围的情况,在32位系统中一般占用4个字节,在64位系统中可能占用8个字节。 long long:C99标准新增的整数类型,通常占用8个字节,能够表示极大的整数。 浮点型(Floating-Point Types) float:单精度浮点型,通常占用4个字节,精度相对较低。 double:双精度浮点型,通常占用8个字节,精度比float高。 long double:扩展精度浮点型,占用的字节数和精度会因编译器和系统的不同而有所差异。 字符型(Character Types) char:用于存储单个字符,通常占用1个字节。 布尔型(Boolean Types) _Bool或bool:用于表示真(true)或假(false)的值,通常占用1个字节。使用bool类型之前需要引入头文件。 二、构造数据类型 数组类型(Array Types):用于存储相同类型数据的集合,可以通过索引访问其中的元素。 结构体类型(Structure Types):用于定义一种包含不同数据类型成员的复合数据类型。 联合体类型(Union Types):用于定义一种可以存储不同数据类型的数据结构,但只能同时存储其中的一种数据类型。 三、指针类型(Pointer Types) 指针是一种特殊的数据类型,用于存储变量的内存地址。通过指针可以直接访问和操作内存中的数据。 四、空类型(Void Types) void类型通常用于函数的返回类型或参数类型,表示没有具体的类型。例如,在函数定义中,如果函数没有返回值,则可以使用void作为返回类型。 五.枚举类型(Enumeration Types) 用于定义一组具有离散取值的常量。以及类型转换的功能,以便在程序中灵活地处理各种数据。
3.指针的作用
一、动态内存管理 指针允许程序在运行时动态地分配和释放内存。通过使用如malloc等函数,指针可以帮助程序创建数组、链表等复杂的数据结构,这些结构的大小和生命周期可以在程序执行过程中动态确定。这种动态内存管理方式相较于静态内存分配更加灵活,能够更好地适应程序运行时的实际需求。 二、高效数据访问和操作 通过指针,程序可以直接访问和操作内存中的数据,避免了不必要的数据复制。这在处理大量数据或进行频繁的数据操作时,可以显著提高程序的执行效率。 指针还支持对数组和字符串等连续内存区域的高效遍历和操作。通过指针的算术运算,如指针加法和减法,程序可以轻松地访问数组或字符串中的任意元素,并进行排序、搜索等复杂操作。 三、实现复杂数据结构 指针是实现如链表、二叉树等复杂数据结构的基础。这些数据结构通过指针来连接各个节点,形成一个有机的整体。指针的灵活性和高效性使得这些数据结构在C语言中得以广泛应用,从而提高了程序的数据处理能力和效率。 四、函数参数传递和返回值 通过指针传递函数参数,可以避免大型数据结构的复制开销,提高函数调用的效率。同时,指针还允许函数直接修改其调用者环境中的变量值,实现了函数间的紧密协作。 在某些情况下,函数可能需要返回一个复杂的数据结构或动态分配的内存区域。此时,可以使用指针作为函数的返回值,以便将这些数据结构或内存区域的地址传递回调用者。 五、底层硬件操作和系统编程 指针的直接内存访问能力使得C语言非常适合进行底层硬件操作和系统级编程。通过指针,程序可以直接读写硬件设备的内存地址,实现与硬件的紧密交互。此外,指针在操作系统开发、网络编程等领域也发挥着重要作用。
4.常量
常量是指在程序运行过程中其值不能被改变的量。在C语言中,常量可以是任何数据类型,如整数、浮点数、字符或字符串。常量在程序编译时被确定,并且在程序的整个生命周期中保持不变。 C语言中的常量有几种类型: 1.整型常量(Integer Constants):如 10, -5, 0 等。 2.浮点型常量(Floating-point Constants):如 3.14, -2.5, 0.0 等。 3.字符型常量(Character Constants):用单引号括起来的单个字符,如 'A', 'a', '0' 等。 4.字符串型常量(String Constants):用双引号括起来的字符序列,如 "Hello, World!"。 5.符号常量(Symbolic Constants):使用 #define 指令定义的常量,如 #define PI 3.14159。
5.文本操作相关配套函数
一.文件打开与关闭 1.fopen 功能:打开文件,为读写操作做准备。 参数:文件名(含路径)和打开模式(如 "r" 读取、"w" 写入、"a" 追加等)。(是用双引号而不是单引号) 返回值:成功时返回文件指针,失败时返回 NULL。 示例: fp = fopen("example.txt", "w"); 2.fclose 功能:关闭已打开的文件,释放相关资源。 参数:文件指针。 返回值:成功时返回 0,失败时返回 EOF。 示例: fclose(fp); 二.字符级读写 1.fgetc 功能:从文件中读取一个字符。 参数:文件指针。 返回值:读取的字符或 EOF(文件结束或错误)。 示例: while ((c = fgetc(fp))!= EOF) { putchar(c); // 输出读取到的字符 } 2.fputc 功能:向文件中写入一个字符。 参数:要写入的字符和文件指针。 返回值:写入的字符或 EOF(错误)。 示例: char ch='A'; fputc(ch, fp); 三.字符串级读写 1.fgets 功能:从文件中读取一行字符串。 参数:存储字符串的缓冲区、缓冲区大小和文件指针。 返回值:成功时返回缓冲区指针,到达文件末尾或错误时返回 NULL。 示例: char buffer[100]; if (fgets(buffer, sizeof(buffer), fp)!= NULL) { printf("%s", buffer); // 输出读取到的内容 } 2.fputs 功能:向文件中写入一行字符串。 参数:要写入的字符串和文件指针。 返回值:成功时返回非负值,错误时返回 EOF。 示例: fputs("This is an example of using fputs function.\n", fp); 四.数据块读写 fread 功能:从文件中读取指定数量的数据块。 参数:存储数据的缓冲区、每个数据块的大小、要读取的数据块数量和文件指针。 返回值:成功读取的数据块数量。 示例: char buffer[100]; // 存储读取的数据 size_t bytes_read; // 存储实际读取的字节数 bytes_read = fread(buffer, sizeof(char), sizeof(buffer), fp); if (bytes_read > 0) { // 输出读取的数据 for (size_t i = 0; i < bytes_read; ++i) { putchar(buffer[i]); } fwrite 功能:向文件中写入指定数量的数据块。 参数:要写入的数据缓冲区、每个数据块的大小、要写入的数据块数量和文件指针。 返回值:成功写入的数据块数量。 示例: char data[] = "Hello, World!"; // 要写入文件的数据 size_t bytes_written; // 存储实际写入的字节数 bytes_written = fwrite(data, sizeof(char), sizeof(data), fp); if (bytes_written == sizeof(data)) { printf("Data written successfully.\n"); } 五.文件定位和状态 fseek 功能:设置文件位置指针。 参数:文件指针、偏移量和起始位置(如 SEEK_SET、SEEK_CUR、SEEK_END)。 返回值:成功时返回 0,失败时返回非零值。 示例: fseek(fp, 7, SEEK_CUR); ftell 功能:获取当前文件位置指针。 参数:文件指针。 返回值:当前位置或 -1(错误)。 示例: long position; // 存储文件指针的位置 position = ftell(fp); feof 功能:检查文件是否已到达末尾。 参数:文件指针。 返回值:到达文件末尾时返回非零值,否则返回 0。 示例: !feof(fp) ferror 功能:检查文件操作是否发生错误。 参数:文件指针。 返回值:发生错误时返回非零值,否则返回 0。 示例: ferror(fp) clearerr 功能:清除文件错误标志和文件结束标志。 参数:文件指针。 返回值:无。 示例: clearerr(fp) 使用 clearerr 函数清除文件的错误标志。在处理完错误后,使用 clearerr 函数将文件的错误标志重置,这样后续的文件操作可以正常进行。如果不清除错误标志,后续的文件操作可能会受到影响,因为文件操作函数可能会检查错误标志并在存在错误时采取相应的错误处理行为。 二.文件操作的基本框架 #include int main() { FILE *fp; // 定义文件指针 // 打开文件 fp = fopen("filename", "mode"); // mode 可以是 "r", "w", "a", "r+", "w+", "a+" 等 if (fp == NULL) { // 检查文件打开是否成功 perror("Error opening file"); return 1; } // 文件操作部分,根据不同的操作需求添加代码 // 例如: // 写入操作:fprintf(fp, "content to write"); // 读取操作:fscanf(fp, "%s", buffer); 或 fgets(buffer, size, fp); // 二进制读取操作:fread(buffer, size, count, fp); // 二进制写入操作:fwrite(buffer, size, count, fp); // 关闭文件 fclose(fp); return 0; }
1.C99和C95只允许提前声明变量类型,不能在for循环中设置变量类型。
2.如果没有在写scanf语句的时候添上&,语句有时候不会报错,但是没有运行结果