C语言是一种广泛应用于操作系统、嵌入式系统、编译器和游戏开发等领域的高级编程语言,以下是C语言知识的总结:
基础语法:C语言的基础语法包括数据类型、变量、运算符、表达式、控制语句等,这些都是编写C语言程序的基本要素。
1、常量
C语言中,常量和变量都是用来存储数据的,但它们有一些不同的特点和用途。下面分别介绍一下C语言中的常量和变量。
常量
常量是指在程序运行时不会改变其值的数据,可以分为字面常量和符号常量。
1.1 字面常量
字面常量是指直接在程序中写出来的常量,例如整数常量、浮点数常量、字符常量和字符串常量。例如:
int a = 10; // 整数常量
float b = 3.14; // 浮点数常量
char c = 'A'; // 字符常量
char str[] = "hello world"; // 字符串常量
1.2 符号常量
符号常量是指用标识符表示的常量,一般用#define预处理器指令进行定义。例如:
#define PI 3.1415926
#define MAX 100
2、变量
变量是指在程序运行时可以改变其值的数据。在C语言中,变量有以下几个要素:
变量名:用来标识变量的唯一名称。
数据类型:决定变量可以存储的数据类型,例如整型、浮点型、字符型等。
存储地址:变量在内存中的存储位置。
初始值:变量在定义时可以指定初始值,如果没有指定初始值,则变量的值是不确定的。
例如:
int num = 10; // 定义一个整型变量num,初始值为10
float f = 3.14; // 定义一个浮点型变量f,初始值为3.14
char ch = 'A'; // 定义一个字符型变量ch,初始值为'A'
3.数据类型
C语言的基本数据类型包括整型、浮点型和字符型。
3.1 整型
整型包括有符号整型和无符号整型两种类型,有符号整型可以表示正数、负数和零,无符号整型只能表示非负数。
C语言中的整型有以下几种类型:
char:字符型,占用1个字节,可以存储一个字符的ASCII码。
short:短整型,占用2个字节,可以存储-32768~32767之间的整数。
int:整型,占用4个字节,可以存储-2147483648~2147483647之间的整数。
long:长整型,占用4个字节或8个字节,可以存储更大范围的整数
例如:
char c = 'A';
short s = 10;
int i = 100;
long l = 100000000L;
3.2 浮点型
浮点型包括单精度浮点型和双精度浮点型两种类型。
C语言中的浮点型有以下两种类型:
float:单精度浮点型,占用4个字节,可以表示7位有效数字。
double:双精度浮点型,占用8个字节,可以表示15位有效数字。
例如:
float f = 3.14;
double d = 3.14159265358979323846;
3.3 字符型
字符型用于存储单个字符,占用1个字节,可以存储一个字符的ASCII码。
例如:
char c = 'A';
派生数据类型
派生数据类型是指由基本数据类型派生出来的数据类型,包括指针、数组、结构体和联合体等。
3.4 指针
指针是存储内存地址的变量,可以用来访问和操作内存中的数据。
例如:
int a = 10;
int *p = &a; // 定义一个指向整型变量a的指针变量p
数组
数组是由相同类型的元素组成的集合,可以通过下标访问数组中的元素。
例如:
int arr[5] = {1, 2, 3, 4, 5}; // 定义一个整型数组arr,包含5个元素
3.5 结构体
结构体是由不同类型的元素组成的集合,可以将不同类型的变量组合在一起。
例如:
struct student {
char name[20];
int age;
float score;
} stu; // 定义一个学生信息结构体
3.6联合体
联合体是由不同类型的变量组成的集合,但同一时刻只能有一个成员变量被使用。
例如:
union data {
int i;
float f;
char c;
} d; // 定义一个数据联合体
总之,C语言提供了丰富的数据类型,可以根据实际需求选择合适的数据类型来存储和处理数据
4.算术运算符
1、加、减、乘、除、取余(+ - * / %)结合方向自左向右
2、关系运算符(> < ==“”>= <= !=“”>
3、逻辑运算符(! && ||)
4、位运算符(<>> ~ | ^ &)
5、赋值运算符(=及符号扩展赋值运算符)
6、条件运算符(? : )
7、逗号运算符( , )
8、指针运算符(* &)
9、求字节运算符(sizeof)
10、强制类型转换运算符((类型))
11、分量运算符( . ->)
12、下标运算符([])
5.比较运算符
== (等于):用于比较两个值是否相等,如果相等则返回1,否则返回0。
!= (不等于):用于比较两个值是否不相等,如果不相等则返回1,否则返回0。
(>)( 大于):用于比较左边的值是否大于右边的值,如果是则返回1,否则返回0。
< (小于):用于比较左边的值是否小于右边的值,如果是则返回1,否则返回0。
(>=)(大于等于):用于比较左边的值是否大于等于右边的值,如果是则返回1,否则返回0。
<= (小于等于):用于比较左边的值是否小于等于右边的值,如果是则返回1,否则返回0。
这些比较运算符可以用于各种类型的数据,包括整型、浮点型、字符型等等。在比较时,需要注意数据类型的匹配问题,否则可能会出现错误的结果。
6、逻辑运算
C语言中的逻辑运算符有三种:与(&&)、或(||)和非(!)。
与(&&):只有两个操作数都为真(非零)时,结果才为真(非零);否则,结果为假(0)。
或(||):只要有一个操作数为真(非零),结果就为真(非零);否则,结果为假(0)。
非(!):对一个操作数取反,如果操作数为真(非零),则结果为假(0);如果操作数为假(0),则结果为真(非零)。
例如:
int a = 3, b = 4, c = 0;
if (a && b) { // a和b都为真,结果为真
printf("a && b is true\n");
}
if (a || c) { // a为真,c为假,结果为真
printf("a || c is true\n");
}
if (!c) { // c为假,结果为真
printf("!c is true\n");
}
7、字符串
C语言中的字符串是由一组字符组成的数据类型。字符串在C语言中是以null字符(‘\0’)结尾的字符数组。C语言中的字符串处理函数都是基于这种特殊的字符数组实现的。
C语言中的字符串可以用单引号或双引号表示。用单引号表示的是一个字符,用双引号表示的是一个字符串。
例如:
char c = 'A'; // 定义一个字符
char str[] = "Hello, world!"; // 定义一个字符串
C语言中的字符串常用操作包括:
字符串长度:使用strlen函数可以获取字符串的长度。
字符串复制:使用strcpy函数可以将一个字符串复制到另一个字符串中。
字符串连接:使用strcat函数可以将两个字符串连接起来。
字符串比较:使用strcmp函数可以比较两个字符串是否相等。
字符串查找:使用strstr函数可以在一个字符串中查找另一个字符串。
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Hello";
char str2[] = "World";
char str3[20];
// 拷贝字符串
strcpy(str3, str1);
printf("str3 = %s\n", str3);
// 连接字符串
strcat(str3, str2);
printf("str3 = %s\n", str3);
// 计算字符串长度
printf("strlen(str3) = %d\n", strlen(str3));
// 比较字符串
if (strcmp(str1, "Hello") == 0) {
printf("str1 equals \"Hello\"\n");
}
// 查找字符串
char *p = strstr(str3, "World");
if (p != NULL) {
printf("Found \"World\" at position %d\n", p - str3);
}
return 0;
}
8、main函数和自定义函数
C语言中的main函数是程序的入口,程序从这里开始执行。它是一个特殊的函数,其返回类型必须是int,表示程序的结束状态。main函数可以接受命令行参数,这些参数可以在程序运行时传递给它。
自定义函数是用户自己编写的函数,用于完成特定的任务。自定义函数可以接受参数,也可以返回一个值。在程序中调用自定义函数可以实现代码的模块化,提高代码的可重用性和可维护性。
9、传值调用和传址调用
传值调用
传值调用是指在调用函数时,将实参的值复制一份给形参,函数中对形参的修改不会影响实参的值。这种方式在函数中只能读取实参的值,不能修改实参的值。
示例代码:
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 10, y = 20;
swap(x, y);
printf("x = %d, y = %d\n", x, y); // 输出 x = 10, y = 20
return 0;
}
传址调用
传址调用是指在调用函数时,将实参的地址传递给形参,函数中对形参的修改会影响实参的值。这种方式在函数中可以修改实参的值。
示例代码:
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 10, y = 20;
swap(&x, &y);
printf("x = %d, y = %d\n", x, y); // 输出 x = 20, y = 10
return 0;
}
在函数中,通过指针访问实参的值,可以修改实参的值。在调用函数时,需要使用取地址符 &将实参的地址传递给形参。注意,形参是指针类型,需要在函数定义中声明。
10、宏定义
C语言宏定义是一种预处理指令,用于将某个标识符或表达式替换为指定的文本。宏定义可以使程序更加简洁、可读性更高,并且可以提高程序的灵活性和可维护性。
宏定义的语法如下:
#define 宏名 替换文本
其中,宏名是标识符,替换文本是要替换成的文本,可以是任意合法的C语言表达式或语句。
带参数的宏定义
#define ADD(x,y) ((x)+(y))
宏定义中的#与##
1.#
在带参数的宏定义中,#运算符后面应该跟一个参数,预处理会把这个参数转换为一个字符串
#include<stdio.h>
#define PRINT(X) printf("the "#X" value is %d\n",X)
int main()
{
int a = 2;
PRINT(a);
return 0;
}
输出:
the a value is 2
PRINT(a) 展开相当于 printf(“the " “a” " value is %d\n”,a)
2.##可以把位于它两边的符号合成一个符号。 它允许宏定义从分离的文本片段创建标识符
#include<stdio.h>
#define A(X,Y) X##Y
int main()
{
int tmp123 = 123;
printf("%d\n", A(tmp, 123));
return 0;
}
输出:
123
总结
总之,C语言是一种强大而灵活的编程语言,熟练掌握C语言的基础知识和高级特性,可以让程序员更加高效地开发各种应用程序