C语言基础学习(Day11)

笔者有话说:从Day8至Day10,我们共计花了3天时间学习指针相关的知识点,今天主要针对前段时间的学习,为大家分享穿插在学习过程中的一些零碎知识点。尽量用通俗易懂的语言带领小白15天掌握C语言基本知识,打卡第十一天~

穿插在学习过程中的一些零碎知识点

(1)* 的含义

①乘法运算

②定义指针变量

int * p; //表示定义了一个名字叫做p的变量,int *表示p只能存放一个普通变量的地址

③指针运算符

该运算符放在已经定义好的指针变量前,如果p是一个已经定义好的指针变量,则*p表示以p的内容位地址的变量。

(2)冒泡排序

#include <stdio.h>

void sort(int * a, int len)
{
	int i, j, t;
	for (i=0; i<len-1; ++i)
	{
		for (j=0; j<len-1-i; ++j)
		{
			if (a[j] > a[j+1])	//">"表示升序,"<"表示降序 
			{
				t = a[j];
				a[j] = a[j+1];
				a[j+1] = t;
			} 
		}
	}
}

int main(void)
{
	int a[6] = {1, 4, 8, -5, 10, 11};
	int i = 0;
	
	sort(a, 6);
	
	for (i=0; i<6; ++i)
	{
		printf("%d\t", a[i]);
	}
	printf("\n");
	return 0;
}

(3)枚举

①什么是枚举

把一个事物所有可能的取值一一列举出来

②怎样使用枚举

以代码说明:

  #include <stdio.h>
    
    enum WeekDay
    {
    	MonDay, TuesDay, WednesDay, ThursDay, FriDay, SaturDay, SunDay	
    };
    
    int main(void)
    {
    	enum WeekDay day = WednesDay;
    	printf("%d", day);
    	
    	return 0;
    }

③枚举的优缺点

优点:使代码更安全

缺点:书写麻烦

(4)进制转换

在汇编中:在数字后加字母B表示二进制数,加字母O表示八进制数,加字母D表示十进制数,加字母H表示十六进制数。

在C语言中:规定八进制前要加0(注意是数字0,不是字母O),十六进制前要加0x或0X,十进制前不用加。

十进制转r进制方法:除r取余,直至商0,余数倒序排列。

(5)补码

学习目标

在**Dev-C++**中

一个int类型的变量所能存储的数字的范围是多少?

int类型变量所能存储的最大正数十六进制表示是:7FFFFFFF

int类型变量所能存储的绝对值最大负整数十六进制表示是:80000000

最小负数的二进制代码是多少?

最大正数的二进制代码是多少?

已知一个整数的二进制代码怎样求出原始的数字?

数字超过最大正数会怎样?

①原码

原码也叫:符号-绝对值码

最高位0表示正1表示负其余二进制位是该数字的绝对值二进制位

原码简单易懂

加减运算复杂

在加减乘除四种运算中,增加了CPU的复杂度

零的表示不唯一

②反码

符号位不变,数值位取反

反码运算不便

没有在计算机中应用

③移码

表示数值平移n位,n称为移码量

移码主要用于浮点数的阶码的存储

④补码

十进制转二进制

正整数转二进制:除2取余,直至商为零,余数倒叙排序;

负整数转二进制:先求与该负数相对应的正整数的二进制代码,然后将所有位取反,末尾加1,不够位数时,左边补1。

示例

 #include <stdio.h>
    
    int main(void)
    {
    	int i = -100;
    	/*
    	分析——————————————————————————————————————————
      	十进制:-100 --> 十六进制:64
    	十六进制:64--> 二进制:0110 0100
    	对二进制数 0110 0100 取反,得到:1001 1011
    	对二进制数 1001 1011 加一,得到;1001 1100
    	int型在Dev-C++中占4个字节,即4*8=32位,所以需要在 1001 1100 左边补24个1(负数左边补1,整数左边补0)
    	再将其转换为十六进制数,得到:FFFFFF9C 
    	 */
    	printf("%#X", i);	//以16进制的形式输出 
    	
    	return 0;	
    }

零的二进制:全是零

二进制转十进制

如果首位是0,则表明是正整数,按普通方法来求;

如果首位是1,则表明是负整数,应将所有位取反,末位加1,所得数字就是该负数的绝对值 。

示例

  #include <stdio.h>
    
    int main(void)
    {
    	int i = 0xFFFFFFCA;
    	/*
    	分析:
    	十六进制:CA-->二进制:1100 1010
    	二进制:1100 1010-->取反:0011 0101
    	二进制:0011 0101-->加1:0011 0110
    	二进制:0011 0110即原负数的绝对值
    	二进制:0011 0110-->十六进制:3 6
    	十六进制:3 6-->十进制:54
    	所以原负数为:-54 
    	*/ 
    	
    	printf("%d", i);
    	
    	return 0;	
    } 

如果全是零,则对应的十进制数就是零。

拓展:在原码的基础上,符号位不变,数值位取反——>得到反码;反码加1——>得到补码

(6)算法

通俗定义:解题的方法和步骤;

狭义定义

对存储数据的操作;

对不同的存储结构,要完成某一个功能所执行的操作是不一样的。

比如:

要输出数组中所有的元素和要输出链表中所有的元素的操作肯定是不一样的。

这说明

算法是依附存储结构的;

不同的存储结构,所执行的算法是不一样的。

广义定义:广义的算法也叫做泛型(无论数据是如何存储的,对数据的操作都一样)。

我们至少可以通过以下两种结构来存储数据:

①数组

优点:存取速度快

缺点插入删除元素的效率很低

②链表

优点插入删除元素效率高不需要一个连续的很大的内存

缺点查找某个位置的元素效率低

(7)位运算符

①&——按位于

1&0=0 1&1=1 0&1=0 0&0=0

&&:逻辑与 也叫 并且

&&与&的含义完全不同

例如

5&7=5
5&&7=1

-5&10=10
-5&&10=1

②|——按位或

1|0=1 1|1=1 0|1=1 0|0=0

|| :逻辑或

③~——按位取反

~i就是把i变量所有的二进制位取反

④^——按位异或

1^0=1 1^1=0 0^1=1 0^0=0

相同为零;

不同为1。

⑤按位左移与按位右移

 <<——按位左移
    	i<<1 表示把i的所有二进制位左移1位
    	i<<3 表示把i的所有二进制位左移3位
    	左移n位相当于乘以2的n次方(前提是数据不能丢失)
    	
 面试题:请问下列两个语句,哪个语句执行的速度快?
    A) i = i * 8;
    B) i = i << 8;
    答案:B快
    
>>——按位右移,左边一般是补0,当然也可能补0
    	i>>1 表示把i的所有二进制位右移1位
    	i>>3 表示把i的所有二进制位右移3位
    	右移n位相当于除以2的n次方(前提是数据不能丢失)

总结

位运算符的现实意义:通过位运算符我们可以对数据的操作精确到每一位。

(8)NULL

二进制全部为零的含义——0000000000000000000000000000000的含义:

①数值0

②字符串结束标记符’\0’

③空指针NULL

NULL本质也是零,而这个零不代表数字零,而表示的是内存单元的编零;

我们计算机规定,以零位编号的存储单元的内容不可读、不可写。

更多推荐

C语言基础学习Day11(连载中)