“->”是一个整体,它是用于指向结构体子数据的指针,用来取子数据。换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”。
p=p->next ,意思是将p指向的一个结构体实例中的子数据next赋值给p。
->的作法就是在引用结构体中的变量!
扩展资料:
在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。
数组的下标,定义数组以用于数组操作
比如int a[6];
就是定义一个一维数组,这个数组名叫做 a ,共有6个元素
同理int b[6][6]
就是定义一个二维数组,这个数组共有6*6个元素
用在一般结构体变量中,直接调用结构体中的某个成员
如: student.name
扩展资料:
成员运算符(·)和指向结构体成员运算符(->)的区别:
两者都是用来引用结构体变量的成员,但它们的应用环境是完全不一样,前者是用在一般结构体变量中,而后者是与指向结构体变量的指针连用,例如:有定义
struct student
{
long num;
float score;
};
struct student stud, *ptr=&stud;
则stud.num、stud.score、ptr->num等都是正确的引用方式,但ptr.num、stud->num就是不允许的,其实ptr->num相当于(*ptr).num,只是为了更为直观而专门提供了这->运算符。
最后指出,这两者都具有最高优先级,按自左向右的方向结合。
!为逻辑运算符 “非”,用来改变条件的逻辑状态,如果条件为真则改变为假
!a
其运算规则为,
1 如果a的值为0,则运算结果为1;
2 如果a的值非0,则运算结果为0。
举例: a!=9 就是a不等于9
&&(与) 和 || (或)都是逻辑表达式里常用的,一般用法是 if(表达式1 || 表达式2) 或者 if(表达式1 && 表达式2)
|| 表示 或 只要有一个非0,整个表达式就为真,就满足if判定的条件
例如 if(1 || 0) ;
1为真 0为假 此判断条件为真
&& 表示 且 if括号内的表达式都为真 才能满足if判定的条件 才会执行if{}里的语句
如果单独写 自增运算符为一个语句,二者没有区别
++i; 和 i++; 都是让i+1赋值给i
但是++和--在变量前后的时候,则是会有不同
++在前
例如: ++a;
说明: ++在前时,b会先自加1,然后才赋值给a
举例: int a, b = 1;
a = ++b; //b增加至2,a得到的值为2
++在后
例如: a++;
说明: ++在后时,b赋值给a,再进行自加
举例: int a, b = 1;
a = b++; //b增加至2,a得到的值为1
在操作数之前的操作符(++b)在变量值在被使用之前增加它的值;在操作数之后的操作符(b++)在变量值被使用之后才增加的值。
扩展资料:
++a 与 a++ 不能被赋值 ,因为他们本身只是拷贝了变量的值,并不是变量本身,你无法向一个值进行赋值
int a = 1;
++a = 5;
这样子是错误的!
取地址运算符 &
& 是一元运算符,返回操作数的内存地址。例如,如果 var 是一个整型变量,则 &var 是它的地址。该运算符与其他一元运算符具有相同的优先级,在运算时它是从右向左顺序进行的。
您可以把 & 运算符读作"取地址运算符",这意味着,&var 读作"var 的地址"。
和指针运算符*
*运算在C语言中,有两种作用:
1 用作乘法,为双目运算符,形式为a*b, 就是计算数学中的a乘以b。
2 用作取值运算,为单目运算符,根据后续操作数(必须为指针)类型,取其指向的值。
所谓的指针,本质上就是地址。 指针变量的值,就是地址的值,当取值运算时就是到对应的内存地址上,依照指针类型进行取值。
sizeof操作符计算的是变量(类型)所占空间的大小,是按字节来计算
sizeof是运算符,不是函数
该运算符在编译阶段就已经起作用了。它以字节为单位返回其操作数的大小。它的操作数可以是数据对象也可以是一个类型。如果是类型那么操作数需要用圆括号括起来。
如:sizeof(int)=4;
sizeof(char)
等于1
sizeof以byte为单位返回操作数的大小
扩展资料:
(0)sizeof是运算符,不是函数;
(1)sizeof不能求得void类型的长度;
(2)sizeof能求得void类型的指针的长度;
(3)sizeof能求得静态分配内存的数组的长度!
(4)sizeof不能求得动态分配的内存的大小!
(5)sizeof不能对不完整的数组求长度;
(6)当表达式作为sizeof的操作数时,它返回表达式的计算结果的类型大小,但是它不对表达式求值!
(7)sizeof可以对函数调用求大小,并且求得的大小等于返回类型的大小,但是不执行函数体!
(8)sizeof求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小之和!
(9)sizeof不能用于求结构体的位域成员的大小,但是可以求得包含位域成员的结构体的大小!
这些都很简单,应该不用过多介绍
操作符 | 功能 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
!= | 不等于 |
== | 等于 |
操作符 | 功能 |
+= | 相加之后赋值 |
-= | 相减之后赋值 |
*= | 相乘之后赋值 |
/= | 相除之后赋值 |
%= | 取余之后赋值 |
>>= | 右移之后赋值 |
<<= | 左移之后赋值 |
丨= | 按位或之后赋值 |
^= | 按位与 |
扩展资料:
单目运算符 双目运算符 三目运算符
单目就是这个运算符只对一个变量进行操作
举例:int a=1;a++;(第二句“a++”则只对a一个变量进行了操作)
双目就是这个运算符对两个变量进行操作
举例:int a=1,b=2,c;c=a+b;(第二句“c=a+b”则是对a,b两个变量进行了操作)
三目就是这个运算符对三个变量进行操作
条件1 ? 表达式2 : 表达式3
是否满足条件1,如果满足则执行操作2,否则执行操作3。
条件运算符是C语言中唯一的一个三目运算符,其求值规则为:如果表达式1的值为真,则以表达式2 的值作为整个条件表达式的值,否则以表达式3的值作为整个条件表达式的值。条件表达式通常用于赋值语句之中。
我们可以把想成这样
求两个数中最大的一个
if(a>b){
max = a;
}else{
max = b;
}
而用?表达式
max = (a>b) ? a : b;
如a>b为真,则把a赋予max,否则把b 赋予max。
是不是很节约代码,又显的高级
C语言提供了六种位运算
位运算符 |
含义 |
举例 |
&(and) |
按位与 |
a&b |
| ( or ) |
按位或 |
a|b |
^ ( xor ) |
按位异或 |
a^b |
~ ( not ) |
按位取反 |
~a |
<< ( shi ) |
左移 |
a<<1 |
>> ( shr ) |
右移 |
a>>1 |
1.1 按位“与”&(双目运算符):仅当两个操作数都为1时,结果为1,否则为0。参与运算的数以补码方式出现。因为计算机是以补码形式存储数据的
例:9&5=1
0000 1001------------- 9的补码
& 0000 0101------------- 5的补码
----------
0000 0001------------- 1的补码
应用:
a、通常将某些位清零或保留某些位。例如:将a的高八位清零,保留低八位,可做a&255运算。
00000000 11111111—————— 255的二进制数
00000000 00100000—————— a的二进制数
------------------
00000000 11111111
将字符“A”的低四位清零 保留高四位 可以做“A”&240( 0xf0)
0100 0001——————“A”的二进制数
1111 0000——————240的二进制数
------------------
0001 0000 保留了“A”的高四位
b、取某数的指定位。例如:设a=1000 1110,要取出a中第二位的1,则可以用 a & 0000 0010 实现。
1.2 按位“或”|(双目运算符):仅当两个操作数都为0时,结果为0,否则为1。
例:9|5=13
0000 1001------------- 9的补码
| 0000 0101------------- 5的补码
----------
0000 1101------------- 13的补码
应用:常用来将源操作数某些位置1。例如:设a=0100 0001,将低四位全部置1,则可以用 a | 0000 1111 实现。
1.3 按位“异或”^(双目运算符):参加运算的两个运算量,如果两个数的相应位的值不同,则该位的结果值为1,否则为0。即:0 ^ 0 =0;0 ^ 1 =1;1 ^ 0 =1;1 ^ 1 =0
例: 9^5=12
0000 1001------------- 9的补码
^ 0000 0101------------- 5的补码
----------
0000 1101------------- 12的补码
应用:
a、特定位置取反。例如:设a=1001,将第2位取反,则可以用 a ^1011 实现。
b、不引入第三变量,交换两个数的值。
例:a=1,b=2,交换两个数的值
a=a^b;
b=a^b;
a=a^b;
1.4按位取反”运算符~
按位取反的意思就是每一位取反,0变1,1变0
所以: ~100 的二进制表示为:1001 1011 所以等号左边=1001 1011
2、移位操作符
2.1 左移运算 <<(丢弃最高位,0补最低位):把一个数的所有位都向左移动若干位。
例如:int i=1;i=i<<2; //这表示将i里的值左移两位。
分析:1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成000... 0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(注:有符号数不完全适用)
2.2 右移运算 >>:把一个数的所有位都向右移动若干位。
例如:int i = 0x80000000;
i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000
分析:符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移。同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位。
操作符 | 功能 |
---|---|
exp1,exp2,…expN | 从左往右依次执行,整个表达式结果是最后一个表达式的结果 |
- void main()
- {
- int a,s,d;
- s=2;
- d=3;
- a=12+(s+2,d+4);
- }
先算括号内的值:s+2=4,d+4=7;括号内应为(4,7),括号内取值只取最后一个,如果没有括号则取第一个;a=12+7=19。
define和const的区别:
const不足的地方,是与生俱来的,const不能重定义,而#define可以通过#undef取消某个符号的定义,再重新定义;
在编译时, 编译器通常不为const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
①32个关键字及其含义:
auto | 声明自动变量 一般不使用 |
double | 声明双精度变量或函数 |
int | 声明整型变量或函数 |
struct | 声明结构体变量或函数 |
break | 跳出当前循环 |
else | 条件语句否定分支(与 if 连用) |
long | 声明长整型变量或函数 |
switch | 用于开关语句 |
case | 开关语句分支 |
enum | 声明枚举类型 |
register | 声明积存器变量 |
typedef | 用以给数据类型取别名(当然还有其他作用) |
char | 声明字符型变量或函数 |
extern | 声明变量是在其他文件正声明(也可以看做是引用变量) |
return | 子程序返回语句(可以带参数,也看不带参数) |
union | 声明联合数据类型 |
const | 声明只读变量 |
float | 声明浮点型变量或函数 |
short | 声明短整型变量或函数 |
unsigned | 声明无符号类型变量或函数 |
continue | 结束当前循环,开始下一轮循环 |
for: | 一种循环语句(可意会不可言传) |
signed | 生命有符号类型变量或函数 |
void | 声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用) |
default | 开关语句中的“其他”分支 |
goto | 无条件跳转语句 |
sizeof | 计算数据类型长度 |
volatile | 说明变量在程序执行中可被隐含地改变 |
do | 循环语句的循环体 |
while | 循环语句的循环条件 |
static | 声明静态变量 |
if | 条件语句 |
②剩余格式控制符:
%d | 整形 |
%f | 浮点型(实型) |
%lf | 双精度 |
%hd | 短整型 |
%ld | 长整型 |
%u | 无符号输出 |
%- | 左对齐 |
%m | 按m个字宽输出 |
%s | 输出字符串 |
%0 | 空位补0 |
%x | 十六进制格式输出 |
%o | 八进制格式输出 |
%e | 指数形式输出 |
%g | 智能输出(%f || %e 选择最优输出方案) |
%c | 输出字符 |
%p | 十六进制形式输出变量地址 |
%.n | 保留小数点后n位or截取字符串前n位 |
③u8,u16,u32
u8是unsigned char
u16是unsigned short
u32是unsigned int