C语言阶段学习已经完结
注意:
函数不能返回局部变量的地址
昨日回顾
1、创建空链表
2、头插
3、尾插
4、链表遍历
5、链表长度
学习笔记
一、链表删除
注意:
应该用一次mlloc释放一次free
释放(free):把之前占用的空间又交回操作系统,使这块空间可以被操作系统分配
1、头删
2、尾删
二、位运算
1、位运算—— 0 1
计算机
存储单位——1Byte = 8位
2、用途:
1)、控制硬件
2)、操作系统的文件中用到位、某系信息的存储
3)、许多压缩和加密操作都是直接处理单独的位
3、位运算
c语言上位运算控制
&:一假则假
与运算清0:
|:有真为真(或运算置1)
~:真假相对
^:同0异1
练习:
不使用第三方变量,实现两个数交换
a = a ^ b;
b = a ^ b;
a = a ^ b
<<:左移
——数值<<位数(相当于乘进制数)
练习:左移将0x55555555置奇数位置1
#include <stdio.h>
int main(void)
{
int a = 0x55555555 ;
printf("%#x\n",a|(0xffffffff));
int i = 0;
for (i = 1; i < 32; i += 2)
{
a = a|(1<<i);
}
printf("%#x\n",a);
return 0;
}
>>:右移
看数据类型,有符号类型——此时右移最高位补符号位(为了确保数的正负性)//算数右移
无符号类型——此时右移最高位补0 // 逻辑右移
练习:
统计int类型中1的个数
#include <stdio.h>
int main(void)
{
#if 0
int a = 0x55555555 ;
printf("%#x\n",a|(0xffffffff));
int i = 0;
for (i = 1; i < 32; i += 2)
{
a = a|(1<<i);
}
printf("%#x\n",a);
#endif
unsigned int a = 0xffffffff;
printf("%#x\n",a);
int i = 0;
int cnt = 0;
for (i = 0; i < 32; ++i)
{
if (a>>i & 1)
{
cnt++;
}
}
printf("%d\n",cnt);
return 0;
}
三、预处理
不是c的一部分,是编译过程的一部分
gcc 编译过程
预处理——编译——汇编——链接(.c--->可执行文件的阶段)
预处理命令
宏定义:
不带参的宏
#define 宏名 宏值 (表示定义了一个 宏)
作用:在代码中用到宏值的地方都可以用宏名代替
预处理阶段:文本的原样替换
注意:
①(#define 宏名 宏值)后面不能写分号
② 宏名一般写大写
结束宏定义的操作:#undef N
练习:
实现圆的面积和周长的计算
#include <stdio.h>
#define Pi 3.14
int main(void)
{
float r;
printf("请输入圆的半径:");
scanf("%f",&r);
printf("圆的面积为:%g\n",Pi*r*r);
printf("圆的周长为:%g\n",2*Pi*r);
return 0;
}