黑马程序员— C语言基础之内存剖析

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

在学习C语言基础知识时,老师对内存的分析很重视,几乎每个知识点都会帮我们分析内存存储情况,透过内存的分析也让我们对C语言有了更深的一些了解,C语言跟其他计算机语言相比,对内存的分析和要求更高,下面我们一起来了解和学习一下C语言的内存剖析,是我个人的在学习中的一些总结,如果问题或者不到位的地方也希望大家能够一起交流和指正。

第一讲  进制

进制是一种计数的方式,数值的表示形式,一般我们C语言主要学习的包括十进制、二进制、八进制、十六进制。也就是说,同一个整数,我们至少有4种表示方式。在C语言的程序运行之前,我们都知道先要进行编译和链接,而数据在计算机中的表现形式都是0跟1,编译就是将程序代码转换成计算机能读懂的0跟1的过程。一个int类型数据占据四个字节,32bit,例如0000 0000 0000 0000 0000 0000 0000 1100,变量在内存中的存储细节问题,内存寻址由大到小,变量分配字节也是由大到小,且变量的地址就是其占据的最小的字节地址

1.二进制

特点:只有0和1,逢2进1

书写格式:0b或者0B开头

使用场合:二进制指令或者二进制文件,变量在内存中就是二进制存储

二进制和十进制的相互转换:举例:0b1100=0*2的0次方+0*2的1次方+1*2的2次方+1*2的3次方,十进制转二进制则是除2

n位二进制位所能表示的数据范围(不考虑负数):0~2的n次方-1

2.八进制

特点:0~7,逢八进一

书写格式:0开头

八进制和二进制之间的互相转换

3.十六进制

特点:0~F,逢十六进一

书写格式:0x或者0X开头

十六进制和二进制之间的相互转换

4.一些常用格式符的总结

%d或%i是以带符号十进制整数的形式输出一个数值

%o以不带符号的八进制形式输出整数

%x以不带符号的十六进制形式输出整数

%c输出一个字符,%s输出一个或者多个字符

%f以小数形式输出单,双精度数,默认输出六位小数,%p输出地址

5.类型说明符

int 4个字节%d

short 2个字节%d

long 8个字节%ld

long long 8个字节%lld

signed和unsigned的区别:

signed 最高位要当作符号位  有符号,正数,0,负数 其实就等价于int

unsigned 最高位不要当作符号位  无符号,正数,0

第二讲  位运算

     之前也学习过很多C语言的基本运算,包括算数运算,赋值运算,自增自减运算,关系运算,逻辑运算还有三目运算等等,而这里的位运算跟数据在计算机内存中的表现形式密不可分,因为数据在计算机中是以0和1的形式存在,而位运算也是基于此形式上进行的运算。

1.按位与  &  :只有对应的两个二进位均为1时,结果位才为1,否则为0

比如9的二进制1001,5的二进制是0101,,9&5=1

规律:二进制中,与1相&就保持原位,与0相&就为0

2.按位或  |  :只要对应的两个二进制位有一个为1时,结果就为1,否则为0

3.按位异或  ^  :当对应的两个二进制位相异(不相同)时,结果为1,否则就为0

规律:相同数值进行异或,结果肯定是0,比如9^9==0

交换:9^5^6==9^6^5

任何数值跟0进行异或,结果还是原来的数值,9^0==9

可以推出a^b^a==b

关于异或有个跟之前可以联系上的小例子:(省略了#include<stdio.h>和主函数)

1 //不引入第三个变量的情况下交换两个变量的值
2     int a=10;
3     int b=11;
4
5     a=a^b;
6     b=a^b;
7     a=a^b;
8     printf("a=%d,b=%d\n",a,b);//利用异或的特性可以得到a^b^a==b

4.按位取反  ~  : 二进制0变1,1变0,符号位也会取反

5.左移  <<  : 把整数a的各个二进制位全部左移n位,高位丢弃,低位补0,左移n位其实就是乘以2的n次方, a<<n

9<<1 ->9*2的1次方 ==18

9<<2 ->9*2的2次方== 36

9<<n ->9*2的n次方

6.右移  >>  : 把整数a的各个二进制位全部右移n位,保持符号位不变,右移n位其实就是除以2的n次方, a>>n

8>>n ->8除以2的n次方

以上是些关于进制以及位运算的一些知识,可能有些生硬和枯燥,下面我们来看一个位运算的练习题更深入了解一些内存的表现形式:

 1 //编写一个函数,用来输出整数在内存中的二进制形式
 2 #include<stdio.h>
 3
 4 void printBinary(int number);// 进行函数的声明
 5
 6 int main()
 7 {
 8
 9     printBinary(15); // 调用此函数并赋值15
10     return 0;
11
12 }
13
14 void printBinary(int number)
15 {
16     int temp=(sizeof(number)<<3) - 1;//纪录现在挪到第几位,换成sizeof(number) *8-1==31,其实还是
17
18     while (temp >= 0) {
19
20         int value= number>>temp & 1;//右移将每位与上1可以得到此位数
21
22         printf("%d",value);
23         temp --;
24
25         if ((temp+1)%4==0) { // 每四位隔一个空格
26             printf(" ");
27         }
28
29     }
30     printf("\n");
31
32 }

总结:可能这个知识点有点枯燥和生硬,但是C语言中对内存的分析是很重要的,学会了分析内存对今后的数组指针等知识的学习很有帮助,因此还是需要好好巩固这一块的基础知识的学习。

时间: 2024-10-06 18:04:10

黑马程序员— C语言基础之内存剖析的相关文章

黑马程序员-C语言基础:数组和字符串

数组:数组的定义注意点 数组初始化正确写法: int args[5] = {1,23,32,4,5}; int args[5] = {12,23}; int args[5] = {[3]=23, [4]=13};//这种写法也可以,直接给其中角标为3和4的赋值 int args[] = {12,23,32};//中括号中没写数组大小,在大括号中一定要写具体数值 int args['A'] = {2,34,5}; 错误写法: int args[];//这样编译器不知道给你开辟多大的内存空间 int

黑马程序员-c语言基础:各种数据类型的输出占位符

c语言中的输出操作相对java来说是比较麻烦的,每种数据类型的输出都有各自的占位符: 下面是各种数据类型的输出占位符: short/int : %d int a = 1; printf("这个整数是:%d", a); long: %ld; (long 是int得修饰,不能算是一种单独的数据类型,只是比int多了四个字节的存储空间) long long: %lld char : %c float/double : %f  float默认是6位小数输出:可以在%f中控制:例如:%.2f:输

黑马程序员-C语言基础:指针类型与指针和数组、字符串的关系

//指针变量就是用来存储地址的,只能存储地址 格式:  int  *p;  这个p为指针变量:指针变量占8个字节 类型是用来说明这个指针指向的类型: 比如上边的int代表这个指针变量会指向int类型的存储空间: int *p = &a;//这样一句可以写,此时的*只是一个标志,表示这个*只是表示p是个指针: *p = &a;//这样写就错了:此时*p表示取p指向的空间的值: 指针疑问:指针既然都占据8个字节,那么为什么要划分类型, 是因为当用*p指针取值或者赋值的时候,知道该取几个字节,比

黑马程序员_01_Java语言基础部分(数据类型与表达式、流程控制语句、数组与方法)

------- android培训.java培训.期待与您交流! ---------- Java语言主要由5中符号组成 标识符:数字.字母.美元符.下划线(注意不能数字开头) 关键字:goto和const保留了它们,但是Java没有使用. 运算符:注意运算符优先级(左结合和右结合要注意) 分隔符:注意+号可以分割字符串. 注释:三种注释. 数据类型与变量 常量: 整型 浮点型 字符:注意后面跟三个八进制(\ddd)和 四位unicode码(\u8bf7) (不区分大小写) 字符串 布尔型 变量:

黑马程序员---C语言基础---结构体

------iOS培训.Java培训.Android培训, iOS学习型技术博客,期待与您交流------ C语言基础---结构体 一.什么是结构体 介绍结构体之前,我想先简单介绍下数组.我想大家对数组都再熟悉不过了,顾名思义,数组就是将一些数据(元素)组合在一起,作为一个整体.使用数组需要注意的是这些元素必须是相同类型.而结构体和数组类似,也是将一些数据组合在一起作为一个整体,但是这些元素可以是不同类型.可以这么理解:结构体是更加灵活的数组,因为它允许元素是不同的类型. 实际生活中,如果我们要

黑马程序员——C语言——基础语法

首先学的是C语言的基础语法,主要分为关键字.标示符.注释.数据.常量.变量. 一.关键字 1   关键字是指在C语言中系统默认的有特殊意义的字符 2   关键字全部是小写字母表示,总共32个关键字(主函数[main]中int .return),如下: auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned

黑马程序员--C语言基础之--变量、内部函数与外部函数

------- IOS培训期待与您交流! ---------- 一.变量 变量代表着一个有名字的.具有特定属性的一个存储单元,运行期间,变量的值是可以改变的.变量必须先定义,后使用.定义时,指定该变量的名字与类型.变量名实际上是以一个名字代表的一个存储地址:而从变量中取值,实际上是通过变量名找到相对应的内存地址,再从该存储单元中读取相对应的数据. 刚刚提到了变量定义这个词,我们知道,在定义函数的时候,我们都会先对函数进行一个声明,这就又引用了一个概念:声明.那么我们先来理解一下什么是声明和定义:

黑马程序员 ---- C 语言基础语法

C 语言基础语法 C程序是由函数组成. C程序的入口是一个名字叫做 main 的函数,简称main函数. 不管程序中有多少函数,都是先执行main函数. 1 #include <stdio.h> 2 3 int main(void) 4 5 { 6 7 return 0; 8 9 } 1.编写 2.编译 cc -c 文件名.c 生成 .o 文件 3.链接 cc 文件名.o      // 2.3结合在一起:  cc 文件名.c -o 文件名 4.运行 ./a.out // ./文件名 C语言中

黑马程序员——c语言基础语法(二)

指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值.未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机.指针变量的赋值只能赋予地址,决不能赋予任何其它数据,否则将引起错误.在C语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址. 两个有关的运算符: &:取地址运算符. *:指针运算符(或称“间接访问” 运算符). C语言中提供了地址运算符&来表示变量的地址.其一般形式为:&变量名: 如&a表示变量a的地址,&b表示