C语言重难点归纳(5)

125 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 14 天,点击查看活动详情

一、二级指针练习-文件读写

  1. 需求:从文件中读取数据,并且将数据存放到堆区的数组中
  • 示例char ** pArray = malloc(sizeof(char *) * len )
  1. 获取有效行数
  • 将文件光标置为文件首

  • fseek(file , 0 ,SEEK_SET)

  1. 读取文件数据并且放入到pArray

  2. 显示数组pArray

  3. 释放数组pArray

二、位运算

  1. 按位取反 ~ 0变1 1变1

  2. 按位与 & 全1为1 一0为0

  3. 按位或 | 全0为0 一1为1

  4. 按位异或 ^ 相同为0 不同为1

三、移位运算符

  1. 左移 <<
  • << X 等价于 乘以 2的X次方 ,用0填充位
  1. 右移 >>
  • >> X 等价于 除以 2的X次方 ,如果有符号,不同的机器可能有不同的结果

下图是位运算解析图 位运算解析图.png

示例程序代码

#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;
}

四、一维数组名称

  1. 本质并不是一个指针

  2. 有两种特殊情况

  • 对数组名称进行sizeof

  • 对数组名称 取地址 ,获取的指针步长是整个数组长度

  1. 除了两种特殊情况外,都是指向数组中首元素的地址 的指针

  2. 数组名--- 指针常量,指针的指向不可以修改

  3. 如果将数组名传入到函数参数中,为了提高可读性通常写为 int arr[]

  4. 访问数组元素时候,下标可以为负数