C 语言编程教程

C 语言 - 首页

C 语言基础

C 语言 - 概述 C 语言 - 特性 C 语言 - 发展历史 C 语言 - 环境设置 C 语言 - 程序结构 C 语言 - Hello World C - 编译过程 C - 注释 C - 标记 C - 关键字 C - 标识符 C - 用户输入 C - 基本语法 C - 数据类型 C - 变量 C - 整数提升 C - 类型转换 C - 类型转换 C - 布尔值

C 语言中的常量和文字

C - 常量 C - 字面量 C - 转义序列 C - 格式说明符

C 语言中的运算符

C - 运算符 C - 算术运算符 C - 关系运算符 C - 逻辑运算符 C - 位运算符 C - 赋值运算符 C - 一元运算符 C - 递增和递减运算符 C - 三元运算符 C - sizeof 运算符 C - 运算符优先级 C - 其他运算符

C 语言中的决策

C - 决策 C - if 语句 C - if...else 语句 C - 嵌套 if 语句 C - switch 语句 C - 嵌套 switch 语句

C 语言中的循环

C - 循环 C - While 循环 C - For 循环 C - Do...while 循环 C - 嵌套循环 C - 无限循环 C - Break 语句 C - Continue 语句 C - goto 语句

C 语言中的函数

C - 函数 C - Main 函数 C - 按值调用函数 C - 按引用调用函数 C - 嵌套函数 C - 可变参数函数 C - 用户定义函数 C - 回调函数 C - return 语句 C - 递归

C 语言中的作用域规则

C - 作用域规则 C - 静态变量 C - 全局变量

C 语言中的数组

C - 数组 C - 数组的属性 C - 多维数组 C - 将数组传递给函数 C - 从函数返回数组 C - 可变长度数组

C 语言中的指针

C - 指针 C - 指针和数组 C - 指针的应用 C - 指针运算 C - 指针数组 C - 指向指针的指针 C - 将指针传递给函数 C - 从函数返回指针 C - 函数指针 C - 指向数组的指针 C - 指向结构体的指针 C - 指针链 C - 指针 vs 数组 C - 字符指针和函数 C - NULL 指针 C - void 指针 C - 悬垂指针 C - 解引用指针 C - Near、Far 和 Huge 指针 C - 指针数组的初始化 C - 指针与多维数组

C 语言中的字符串

C - 字符串 C - 字符串数组 C - 特殊字符

C 语言的结构体和联合

C - 结构体 C - 结构体和函数 C - 结构体数组 C - 自引用结构 C - 查找表 C - 点 (.) 运算符 C - 枚举(或 enum) C - 结构填充和打包 C - 嵌套结构 C - 匿名结构和联合 C - 联合 C - Bit 位字段 C - Typedef

C 语言中的文件处理

C - 输入和输出 C - 文件 I/O(文件处理)

C 语言中的预处理器

C - 预处理器 C - #pragma 编译指示 C - 预处理器操作符 C - 宏 C - 头文件

C 语言中的内存管理

C - 内存管理 C - 内存地址 C - 存储类

C 其他主题

C - 错误处理 C - 可变参数 C - 命令执行 C - 数学函数 C - static 静态关键字 C - 随机数生成 C - 命令行参数

C 语言编程资源

C语言问题与解答答案 C语言快速指南 C语言速查表 C语言实用资源 C语言讨论


C - 其他运算符

除了主要的运算符类别(算术、逻辑、赋值等)之外,C 语言还使用以下同样重要的运算符。让我们来讨论一下这些属于此类别的运算符。

"&"符号在 C 语言中已被定义为二元与运算符,如果两个操作数中都存在一位,则将一位复制到结果中。"&"符号也被定义为取地址运算符

"*"符号 - 一个众所周知的乘法算术运算符,它也可以用作解引用运算符

C 使用">"符号,它被定义为三元运算符,用于计算条件表达式的值。

在 C 语言中,点"."符号用作与结构体或联合类型相关的成员访问运算符。

C 语言也使用箭头""符号作为间接运算符,尤其用于指向结构体变量的指针。

运算符 描述 示例
sizeof() 返回变量的大小。 sizeof(a),其中 a 为整数,将返回 4。
& 返回变量的地址。 &a;返回变量的实际地址。
* 指向变量的指针。 *a;
?: 条件表达式。 如果条件为真?则返回值 X,否则返回值 Y
. 成员访问运算符 var.member
−> 使用指针访问结构体变量的成员 ptr −> member;

C 语言中的 sizeof 运算符

sizeof 运算符是一个编译时一元运算符。它用于计算其操作数的大小,操作数可以是数据类型或变量。它返回以字节数表示的大小。它可以应用于任何数据类型、浮点类型或指针类型变量。

sizeof(type 或 var);

当 sizeof() 与数据类型一起使用时,它仅返回分配给该数据类型的内存量。不同机器上的输出可能不同,例如 32 位系统可能显示不同的输出,而 64 位系统可能显示相同数据类型的不同输出。

示例

这是一个 C 语言示例

#include <stdio.h>

int main(){

   int a = 16;
   
   printf("Size of variable a : %d
",sizeof(a));
   printf("Size of int data type : %d
",sizeof(int));
   printf("Size of char data type : %d
",sizeof(char));
   printf("Size of float data type : %d
",sizeof(float));
   printf("Size of double data type : %d
",sizeof(double));   
 
   return 0;
}

输出

运行此代码时,将产生以下输出 -

Size of variable a: 4
Size of int data type: 4
Size of char data type: 1
Size of float data type: 4
Size of double data type: 8

C 语言中的地址运算符

"&"运算符返回现有变量的地址。我们可以将其赋值给指针变量 -

int a;

假设编译器在地址 1000 处创建变量,并在地址 2000 处创建"x",那么"a"的地址存储在"x"中。

头文件

示例

让我们通过一个例子来理解这一点。这里,我们声明了一个 int 变量。然后,我们打印它的值和地址 -

#include <stdio.h>

int main(){

   int var = 100;
   
   printf("var: %d address: %d", var, &var);
   
   return 0;
}

输出

运行代码并检查其输出 −

var: 100 address: 931055924

C 语言中的解引用运算符

要声明一个指针变量,请使用以下语法 -

type *var;

变量名称必须以星号 (*) 为前缀。数据类型表示它可以存储哪种数据类型的地址。例如 -

int *x;

在本例中,变量 x 用于存储另一个 int 变量的地址。

float *y;

"y"变量是一个指针,用于存储浮点变量的内存位置。

"&"运算符返回现有变量的地址。我们可以将其赋值给指针变量 -

int a;
int *x = &a;

我们可以看到,这个变量(任何类型的变量)的地址都是整数。因此,如果我们尝试将其存储在 int 类型的指针变量中,看看会发生什么 -

float var1 = 10.55;
int *intptr = &var1;

编译器不接受这种情况,并报告以下错误 -

从不兼容的指针类型"float *"初始化"int *" [-Wincompatible-pointer-types]

这表明变量的类型及其指针的类型必须相同。

在 C 语言中,变量具有特定的数据类型,这些数据类型定义了它们的大小以及它们如何存储值。使用匹配类型声明指针(例如 "float *")可强制指针与其指向的数据之间保持类型兼容性。

在 C 语言中,不同的数据类型占用不同的内存空间。例如,int 通常占用 4 个字节,而 float 则可能占用 4 个或 8 个字节,具体取决于系统。

对指针进行整数加减操作会根据其指向的数据的大小在内存中移动它们。

因此,我们声明 float * 类型的 floatptr 变量。

示例 1

请看以下示例 -

#include <stdio.h>

int main(){

   float var1 = 10.55;
   float *floatptr = &var1;

   printf("var1: %f 
address of var1: %d 

floatptr: %d 
address of floatptr: %d", var1, &var1, floatptr, &floatptr);

   return 0;
}

输出

var1: 10.550000 
address of var1: 6422044 

floatptr: 6422044 
address of floatptr: 6422032

示例 2

* 运算符称为解引用运算符。它返回存储在指针地址中的值,即指针指向的变量的值。请看以下示例 -

#include <stdio.h>

int main(){

   float var1 = 10.55;
   float *floatptr = &var1;

   printf("var1: %f address of var1: %d
",var1, &var1);
   printf("floatptr: %d address of floatptr: %d
", floatptr, &floatptr);
   printf("var1: %f value at floatptr: %f", var1, *floatptr);

   return 0;
}

输出

运行此代码后,您将获得以下输出 -

var1: 10.550000 address of var1: 6422044
floatptr: 6422044 address of floatptr: 6422032
var1: 10.550000 value at floatptr: 10.550000

C 语言中的三元运算符

在 C 语言中,"?"字符用作三元运算符。它也被称为条件运算符

"三元"一词表示该运算符有三个操作数。三元运算符通常用于以紧凑的方式编写条件 (if-else) 语句。

? 运算符的用法如下语法 -

exp1 ? exp2 : exp3

它有以下三个操作数 -

  • exp1 - 一个布尔表达式,其值为 True 或 False
  • exp2 - 由 ? 返回当 exp1 为真时,? 运算符的返回值。
  • exp3 − 当 exp1 为假时,? 运算符返回的值。

示例

以下 C 程序使用 ? 运算符检查 a 的值是偶数还是奇数。

#include <stdio.h>

int main(){

   int a = 10;
   (a % 2==0) ? printf("%d is Even
", a) : printf("%d is Odd
", a);

   return 0;
}

输出

10 is Even

将"a"的值更改为 15,然后再次运行代码。现在您将获得以下输出 -

15 is Odd

条件运算符是 if - else 结构的简洁表示。

C 语言中的点 (.) 运算符

在 C 语言中,您可以使用 struct 和 union 关键字定义派生数据类型。派生数据类型或用户定义的数据类型将不同类型的成员元素组合在一起。

当与 struct 或 union 变量一起使用时,点运算符是成员选择运算符。点 (.) 运算符在 C 语言中具有最高优先级,并且其结合性从左到右。

查看其语法

var.member;

其中,var 是某个结构体或联合类型的变量,member 是创建结构体或联合时定义的元素之一。

使用 struct 关键字定义新的派生数据类型,语法如下 −

struct newtype {
   type elem1;
   type elem2;
   type elem3;
   . . .
   . . .
};

然后,您可以将此派生数据类型的变量声明为 -

struct newtype var;

要访问某个成员,

var.elem1;

示例

我们声明一个名为 book 的结构体类型,并声明一个结构体变量。以下示例展示了如何使用"."运算符访问 book 结构体中的成员。

#include <stdio.h>

struct book{
   char title[10];
   double price;
   int pages;
};

int main(){

   struct book b1 = {"Learn C", 675.50, 325};
   printf("Title: %s
", b1.title);
   printf("Price: %lf
", b1.price);
   printf("No of Pages: %d
", b1.pages);
   printf("size of book struct: %d", sizeof(struct book));

   return 0;
}

输出

运行此代码后,您将获得以下输出 -

Title: Learn C
Price: 675.500000
No of Pages: 325
size of book struct: 32

C 语言中的间接运算符

结构体是 C 语言中的派生数据类型。C 语言提供了 struct 关键字来定义自定义数据类型。

使用 struct 关键字定义新的派生数据类型,其语法如下:语法

struct type {
   type var1;
   type var2;
   type var3;
   . . .
   . . .
};

然后,您可以将此派生数据类型的变量声明为:−

struct 类型 = var;

通常,结构体在程序中定义第一个函数之前、include 语句之后声明。这样,派生类型就可以用于在任何函数内声明其变量。

让我们声明一个名为 book 的结构体类型,如下所示 -

struct book {
   char title[10];
   double price;
   int pages;
};

要声明此类型的变量,请使用以下语法 -

struct book b1;

结构体变量的初始化是通过将每个元素的值放在花括号内来完成的。

struct book b1 = {"Learn C", 675.50, 325};

您也可以将结构体变量的地址存储在结构体指针变量中。

struct book *strptr;

要存储地址,请使用"&"运算符。

strptr = &b1;

C 语言定义了箭头 () 符号,用于结构体指针的间接寻址运算符(也称为结构体解引用运算符)。它有助于访问指针所引用的结构体变量的元素。

示例

在此示例中,strptr 是指向结构体 book b1 变量的指针。因此,strrptr−>title 返回书名,类似于 b1.title 的返回值。

#include <stdio.h>
#include <string.h>

struct book {
   char title[10];
   double price;
   int pages;
};

int main() {
   struct book b1 = {"Learn C", 675.50, 325};
   struct book *strptr;
   strptr = &b1;
   printf("Title: %s
", strptr->title);
   printf("Price: %lf
", strptr->price);
   printf("No of Pages: %d
", strptr->pages);

   return 0;
}

输出

运行代码并检查其输出 −

Title: Learn C
Price: 675.500000
No of Pages: 325