Cprogramming 简明教程
C - Misc Operators
除了主要的操作符类别(算术、逻辑、赋值等),C 使用了以下同样重要的操作符。我们来讨论在此类别下分类的操作符。
该符号“&”,已经在 C 中被定义为 Binary AND Operator ,如果它存在于两个运算对象中,则它会将位复制到结果中。该符号“&”也被定义为 address−of operator.
" symbol − A well−known arithmetic operator for multiplication, it can also be used as a *dereference operator.
C 使用“>”符号,定义为 ternary operator, 用于计算条件表达式。
在 C 中,点符号“.”用作与结构或联合类型有关的成员访问运算符。
C 还使用箭头“→”符号作为间接寻址运算符,特别用于指向结构变量的指针。
Operator |
Description |
Example |
sizeof() |
返回变量的大小。 |
sizeof(a),其中 a 是整数,将返回 4。 |
& |
返回变量的地址。 |
&a;返回变量的实际地址。 |
* |
Pointer to a variable. |
*a; |
?: |
Conditional Expression. |
如果条件为真?那么值为 X,否则值为 Y |
. |
Member access operator |
var.member |
−> |
使用指针访问结构变量的成员 |
ptr −> member; |
The sizeof Operator in C
sizeof 运算符是编译时一元运算符。它用于计算其操作数的大小,操作数可能为数据类型或变量。它以字节数返回大小。它可以应用于任何数据类型、浮点类型或指针类型变量。
sizeof(type or var);
当把 sizeof() 与数据类型一起使用时,它仅仅返回分配给该数据类型的内存量。输出在不同的机器上可能不同,比如 32 位系统可能显示不同输出,而 64 位系统可能显示相同数据类型的不同输出。
Example
以下是 C 语言中的示例
#include <stdio.h>
int main(){
int a = 16;
printf("Size of variable a : %d\n",sizeof(a));
printf("Size of int data type : %d\n",sizeof(int));
printf("Size of char data type : %d\n",sizeof(char));
printf("Size of float data type : %d\n",sizeof(float));
printf("Size of double data type : %d\n",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
Address-of Operator in C
“&”运算符返回现有变量的地址。我们可以将其分配给一个指针变量
int a;
假设编译器在地址 1000 创建变量并创建 x 在地址 2000,那么 a 的地址存储在 x 中。
The Dereference Operator in C
要声明一个指针变量,要使用以下语法
type *var;
该变量的名称必须以星号 (*) 为前缀。数据类型表明它可以存储哪种数据类型的地址。例如
int *x;
在这种情况下,变量 x 用于存储另一个 int 变量的地址。
float *y;
"y" 变量是一个指针,它存储一个 float 变量的内存位置。
"&" 运算符返回一个现有变量的地址。我们可以把它分配给指针变量 −
int a;
int *x = &a;
我们可以看到,这个变量的地址(对于任何类型的变量而言)是一个整数。所以,如果我们尝试把它存储在一个 int 类型指针变量中,看会发生什么 −
float var1 = 10.55;
int *intptr = &var1;
编译器不接受这个,并报告以下错误 −
initialization of 'int *' from incompatible pointer type 'float *' [-Wincompatible-pointer-types]
它表示变量的类型和它指针的类型必须相同。
在 C 中,变量有特定的数据类型,数据类型定义了变量的大小和它们如何存储值。使用匹配的类型声明一个指针(例如, "float *" )强制指针和它指向的数据之间的类型兼容性。
不同的数据类型在 C 中占用不同的内存空间。比如,一个 int 通常需要 4 个字节,而一个 float 可能需要 4 或 8 个字节,取决于系统。
在指针中添加或减去整数根据这些指针所指向数据的大小,在内存中移动这些指针。
因此,我们声明 floatptr 变量为 float * 类型。
Example 1
请看以下示例:
#include <stdio.h>
int main(){
float var1 = 10.55;
float *floatptr = &var1;
printf("var1: %f \naddress of var1: %d \n\nfloatptr: %d \naddress of floatptr: %d", var1, &var1, floatptr, &floatptr);
return 0;
}
var1: 10.550000
address of var1: 6422044
floatptr: 6422044
address of floatptr: 6422032
Example 2
-
运算符被称为解引用运算符。它返回存储在指针中地址中的值,即它所指向的变量的值。看一看以下这个例子 −
#include <stdio.h>
int main(){
float var1 = 10.55;
float *floatptr = &var1;
printf("var1: %f address of var1: %d\n",var1, &var1);
printf("floatptr: %d address of floatptr: %d\n", 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
The Ternary Operator in C
在 C 语言中,?字符用作三元运算符。它也被称为 conditional operator.
“三元”一词表示运算符有三个操作数。三元运算符经常用于以紧凑的方式表达条件(if-else)语句。
?运算符与以下 syntax 搭配使用 −
exp1 ? exp2 : exp3
它具有以下 three operands −
-
exp1 − 一个布尔表达式,其值为 True 或 False
-
exp2 − 当 exp1 为真时,由 ? 运算符返回
-
exp3 − 当 exp1 为假时,由 ? 运算符返回
The Dot (.) Operator in C
在C语言中,可以通过struct和union关键字定义一个派生数据类型。将不同类型成员元素分组在一起的派生或用户自定义数据类型。
与struct或union变量一起使用时,点操作符是一个 member selection operator, 。点(.)运算符具有 highest operator precedence in C 语言,其结合性是从左到右。
看看它的 syntax −
var.member;
此处,var是某种struct或union类型的一个变量,member是在创建结构或联合时定义的一个元素。
使用 struct 关键字定义了新的派生数据类型,语法如下:
struct newtype {
type elem1;
type elem2;
type elem3;
. . .
. . .
};
然后,你可以声明这种派生数据类型的变量如下 −
struct newtype var;
访问某个成员,
var.elem1;
Example
让我们声明一个名为book的struct类型,声明一个struct变量。以下示例显示了使用“.”运算符来访问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\n", b1.title);
printf("Price: %lf\n", b1.price);
printf("No of Pages: %d\n", 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
The Indirection Operator in C
结构是C语言中的一种派生数据类型。在C语言中,struct关键字已提供用于定义自定义数据类型。
使用 struct 关键字定义新的派生数据类型,如下 syntax −
struct type {
type var1;
type var2;
type var3;
. . .
. . .
};
然后,你可以声明这种派生数据类型的变量如下 −
struct type = var;
通常情况下,结构在程序中定义第一个函数之前,在include语句之后声明。这样,可以在任何函数内声明其变量,以用于派生类型。
让我们声明一个名为book的struct类型,如下所示:−
struct book {
char title[10];
double price;
int pages;
};
若要声明此类型的变量,请使用以下语法:−
struct book b1;
通过将每个元素的值放在大括号内来完成struct变量的初始化。
struct book b1 = {"Learn C", 675.50, 325};
您还可以将struct变量的地址存储在struct指针变量中。
struct book *strptr;
若要存储地址,请使用“&”运算符。
strptr = &b1;
C定义了箭头(→)符号与struct指针一起用作间接操作符(也称为struct取消引用操作符)。它有助于访问指针引用到的struct变量的元素。
Example
在此示例中,strptr是struct 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\n", strptr->title);
printf("Price: %lf\n", strptr->price);
printf("No of Pages: %d\n", strptr->pages);
return 0;
}
运行代码并检查其输出:
Title: Learn C
Price: 675.500000
No of Pages: 325