开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 14 天,点击查看活动详情。
一、二级指针练习-文件读写
- 需求:从文件中读取数据,并且将数据存放到堆区的数组中
- 示例
char ** pArray = malloc(sizeof(char *) * len )
- 获取有效行数
-
将文件光标置为文件首
-
fseek(file , 0 ,SEEK_SET)
-
读取文件数据并且放入到
pArray中 -
显示数组
pArray -
释放数组
pArray
二、位运算
-
按位取反 ~ 0变1 1变1
-
按位与 & 全1为1 一0为0
-
按位或 | 全0为0 一1为1
-
按位异或 ^ 相同为0 不同为1
三、移位运算符
- 左移 <<
<< X等价于 乘以 2的X次方 ,用0填充位
- 右移 >>
>> X等价于 除以 2的X次方 ,如果有符号,不同的机器可能有不同的结果
下图是位运算解析图
示例程序代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//1、按位取反 ~
void test01()
{
int num = 2;
printf("~num = %d\n", ~num); // -很大 -2 253 1 -很小 +很大 -3
// 010 按位取反 101 源码
// 101 补码 110 + 1 = 111
}
//2、按位与
void test02()
{
int num = 124;
if ( (num & 1) == 0)
{
printf("num为偶数\n");
}
else
{
printf("num为奇数\n");
}
}
//3、按位或 |
void test03()
{
int num1 = 5;
int num2 = 3;
printf("num1 | num2 = %d\n", num1 | num2); // 7
}
void test04()
{
int num1 = 10;
int num2 = 20;
printf("num1 = %d\n", num1);
printf("num2 = %d\n", num2);
//int temp = num1;
//num1 = num2;
//num2 = temp;
//利用按位异或实现两个数的交换
num1 = num1 ^ num2;
num2 = num1 ^ num2;
num1 = num1 ^ num2;
//不用临时数字实现两个变量交换
//num1 = num1 + num2;
//num2 = num1 - num2;
//num1 = num1 - num2;
printf("交换后\n");
printf("num1 = %d\n", num1);
printf("num2 = %d\n", num2);
}
//左移运算符
void test05()
{
int num = 10;
printf("%d\n", num <<= 2);
}
//右移运算符
void test06()
{
int num = 10;
printf("%d\n", num >>= 1);
}
int main(){
//test01();
//test02();
//test03();
//test04();
//test05();
test06();
system("pause");
return EXIT_SUCCESS;
}
四、一维数组名称
-
本质并不是一个指针
-
有两种特殊情况
-
对数组名称进行
sizeof -
对数组名称 取地址 ,获取的指针步长是整个数组长度
-
除了两种特殊情况外,都是指向数组中首元素的地址 的指针
-
数组名--- 指针常量,指针的指向不可以修改
-
如果将数组名传入到函数参数中,为了提高可读性通常写为
int arr[] -
访问数组元素时候,下标可以为负数