C语言
文章平均质量分 64
妥妥50w
编程也太简单了吧
展开
-
C语言-----预处理、宏定义
由源码到可执行程序的过程(1)源码.c->(编译)->elf可执行程序(2)源码.c->(编译)->目标文件.o->(链接)->elf可执行程序(3)源码.c->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程序(4)源码.c->(预处理)->预处理过的.i源文件->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程原创 2021-03-23 18:43:17 · 273 阅读 · 0 评论 -
计算机存储系统——大小端模式
大小端模式介绍在计算机内存/硬盘/Nnad中。因为存储系统是32位的,但是数据仍然是按照字节为单位的。于是乎一个32位的二进制在内存中存储时有2种分布方式:高字节对应高地址(大端模式)高字节对应低地址(小端模式)解析:0x12345678,其中12相对34相对56相对78为高字节0x00000001相对0x00000000为高地址判断机器大小端的两种方式:第一种:共用体union myunion { int a; char b;};void little_endian(voi原创 2021-03-22 17:15:31 · 960 阅读 · 0 评论 -
共用体union
标题(1)共用体union和结构体struct在类型定义、变量定义、使用方法上很相似。(2)共用体和结构体的不同:结构体类似于一个包裹,结构体中的成员彼此是独立存在的,分布在内存的不同单元中,他们只是被打包成一个整体叫做结构体而已;共用体中的各个成员其实是一体的,彼此不独立,他们使用同一个内存单元。可以理解为:有时候是这个元素,有时候是那个元素。更准确的说法是同一个内存空间有多种解释方式。(3)共用体union就是对同一块内存中存储的二进制的不同的理解方式。(4)在有些书中把union翻译成联合(联原创 2021-03-22 16:45:22 · 193 阅读 · 0 评论 -
结构体对齐
结构体对齐的规则1.n字节对齐,32位默认n为4,64位默认n位8,(n是结构体内长度最大的数据类型的长度(字节数),)2.每个变量的对齐规则都是自己的数据类型长度大小3.总长度是字节对齐数的整数倍struct s1{ int a; // 4 char b; // 1+1 ,补1个 short c; // 2 };typedef struct s2{ // 1字节对齐 8字节对齐 int a; // 4 4 struct原创 2021-03-21 12:56:01 · 183 阅读 · 0 评论 -
字符串、字符数组、sizeof、strlen
(1)字符串1.1 C语言没有原生字符串类型(1)很多高级语言像java、C#等就有字符串类型,有个String来表示字符串,用法和int这些很像,可以String s1 = “linux”;来定义字符串类型的变量。(2)C语言没有String类型,C语言中的字符串是通过字符指针来间接实现的。1.2 C语言使用指针来管理字符串(1)C语言中定义字符串方法:char *p = “linux”,其实就是定义了一个字符指针,p占了8个字节,linux占了6个字节,1.3、C语言中字符串的本质:指针指向原创 2021-03-17 20:18:26 · 348 阅读 · 0 评论 -
二重指针、二维数组、二维数组和指针的运算
(1)二重指针(1)本质上来说,二重指针和一重指针的本质都是指针变量,指针变量的本质就是变量。(2)一重指针变量和二重指针变量本身都占8字节内存空间(64位)二重指针的简单应用: int a = 10; int *p = NULL; int **p1 = NULL; p = &a; p1 = &p; printf("*p=%d\n",*p); printf("**p1 = %d\n",**p1);二重指针和指针数组结合#include <stdio.h原创 2021-03-14 00:36:05 · 512 阅读 · 0 评论 -
指针数组和数组指针、函数指针以及typedef的用法
指针数组和数组指针概念:(1)指针数组:指针数组是一个数组,数组元素是指针。(2)数组指针的实质是一个指针,这个指针指向的是一个数组。表达式:int *p[5] //等效于int *(p[5]),这两个都是指针数组int (*p)[5] //指针被括起来,是数组指针关于优先级:[] . ->这三个优先级比较高函数指针概念:函数指针也是一个指针,指针就是指针变量(32位电脑占4个字节,64位电脑占8个字节)表达式:假设:void func(void){ prin原创 2021-03-13 17:53:53 · 851 阅读 · 0 评论 -
指针与函数传参---以及参数中的输入型参数与输出型参数
普通变量作为函数形参(1)形参额外申请内存,实参传过来的是值,函数执行结束之后,形参的内存会自动释放。数组作为函数形参(1)函数名作为形参传参时,实际传递不是整个数组,而是数组的首元素的首地址,所以在子函数内部,传进来的数组名就等于是一个指向数组首元素首地址的指针。所以sizeof得到的是4.(2)在子函数内传参得到的数组首元素首地址,和外面得到的数组首元素首地址的值是相同的。很多人把这种特性叫做“传址调用”(3)数组作为函数形参时,[ ]里的数字是可有可无的,因为数组名做形参传递的实际只是个指针原创 2021-03-09 16:00:57 · 1440 阅读 · 0 评论 -
运算符sizeof、指针长度、数组形参
sizeof(1)sizeof是C语言的一个运算符(不是函数)(2)sizeof的作用是用来返回()里面的变量或者数据类型占用的内存字节数。(2)为什么需要sizeof?主要是因为在不同平台下各种数据类型所占的内存字节数不尽相同(譬如int在32位系统中为4字节,在16位系统中为2字节···)。所以程序中需要使用sizeof来判断当前变量/数据类型在当前环境下占几个字节。sizeof(数组名)计算数组长度(字节为单位)char str[] = "hello"; printf("sizeof(原创 2021-03-09 15:49:23 · 6922 阅读 · 0 评论 -
指针与强制类型转换(int short char float double)
变量的数据类型的含义(1)所有的类型的数据存储在内存中,都是按照二进制格式存储的。所以内存中只知道有0和1,不知道是int的、还是float的还是其他类型。(2)int、char、short等属于整型,他们的存储方式(数转换成二进制往内存中放的方式)是相同的,只是内存格子大小不同(所以这几种整形就彼此叫二进制兼容格式);而float和double的存储方式彼此不同,和整型更不同。(3)用int类型的方式定义a,a在内存中以int类型的存储方式,要用%d的解析方式解析,存储方式和解析方式要对应。* 按原创 2021-03-09 15:20:21 · 8506 阅读 · 0 评论 -
数组-----指针(1)
数组中几个关键符号aa[0]&a&a[0]前提是 int a[10]1.a就是数组名。a做右值表示数组首元素(数组的第0个元素,也就是a[0])的首地址(首地址就是起始地址,就是4个字节中最开始第一个字节的地址)。a做右值等同于&a[0];(2)a[0]表示数组的首元素,也就是数组的第0个元素。做左值时表示数组第0个元素对应的内存空间(连续4字节);做右值时表示数组第0个元素的值(也就是数组第0个元素对应的内存空间中存储的那个数)(3)&a就是数组名a取地址,原创 2021-03-09 11:37:42 · 657 阅读 · 0 评论 -
用宏定义来完成位运算
直接上代码:第一题:用宏定义将32位数x的第n位(右边起算,也就是bit0算第1位)置位#include <stdio.h>#define SET_BIT_N(x,n) (x|(1U<<(n-1)))int main(){ unsigned int a = 0x0; unsigned int b = SET_BIT_N(a,3); printf("0x%x\n",b); //成功为:0x4,运行结果为0x4 return 0;}第二题:用宏定原创 2021-03-06 15:05:31 · 1094 阅读 · 0 评论 -
位运算实战演练
//demo1:给定一个整型数a,设置a的bit3,保证其他位不变 unsigned int a = 0xf00; a |= (0x1<<3); printf("0x%x\n",a); ```c //demo2:给定一个整形数a,设置a的bit3~bit7,保持其他位不变。 unsigned int a = 0xf00; a |= (0x1f<<3); printf("0x%x\n",a); //成功为0xff8 //demo3:给定一个整型数a,.原创 2021-03-06 14:59:57 · 154 阅读 · 0 评论 -
内存管理之 栈和堆
什么是栈栈是一种数据结构,C语言中使用栈来保存局部变量。栈是被发明出来管理内存的。栈管理内存的特点先进后出 FILO first in last out 栈先进先出 FIFO first in first out 队列栈的特点是入口即出口,只有一个口,另一个口是堵死的。所以先进去的必须后出来。队列的特点是入口和出口都有,必须从入口进去,从出口出来,所以先进去的必须先出来,否则就堵住后面的。栈的应用举例:局部变量C语言中的局部变量是用栈来实现的。我们在C中定义一个局部变量时(i原创 2021-03-02 11:42:03 · 462 阅读 · 0 评论 -
C语言如何操作内存
C语言对内存地址的封装譬如在C语言中 int a; a = 5; a += 4; // a == 9;结合内存来解析C语言语句的本质:int a; // 编译器帮我们申请了1个int类型的内存格子(长度是4字节,地址是确定的,但是只有编译器知道,我们是不知道的,也不需要知道。),并且把符号a和这个格子绑定。a = 5; // 编译器发现我们要给a赋值,就会把这个值5丢到符号a绑定的那个内存格子中。a += 4; // 编译器发现我们要给a加值,a += 4 等效于 a = a + 4;编译器会先原创 2021-03-02 11:32:19 · 626 阅读 · 0 评论 -
内存编址和寻址、内存对齐
内存编址方法内存在逻辑上就是一个一个的格子,这些格子可以用来装东西(里面装的东西就是内存中存储的数),每个格子有一个编号,这个编号就是内存地址,这个内存地址(一个数字)和这个格子的空间(实质是一个空间)是一一对应且永久绑定的。这就是内存的编址方法。在程序运行时,计算机中CPU实际只认识内存地址,而不关心这个地址所代表的空间在哪里,怎么分布这些实体问题。因为硬件设计保证了按照这个地址就一定能找到这个格子,所以说内存单元的2个概念:地址和空间是内存单元的两个方面。内存编址是以字节为单位的我随便给一个数字转载 2021-03-02 11:24:14 · 700 阅读 · 0 评论 -
位、字节、半字、字的概念和内存位宽
什么是内存从硬件角度:内存实际上是电脑的一个配件(一般叫内存条)。根据不同的硬件实现原理还可以把内存分成SRAM和DRAM(DRAM又有好多代,譬如最早的SDRAM,后来的DDR1、DDR2·····、LPDDR)从逻辑角度:内存是这样一种东西,它可以随机访问(随机访问的意思是只要给一个地址,就可以访问这个内存地址)、并且可以读写(当然了逻辑上也可以限制其为只读或者只写);内存在编程中天然是用来存放变量的(就是因为有了内存,所以C语言才能定义变量,C语言中的一个变量实际就对应内存中的一个单元)。内存的原创 2021-03-02 11:18:58 · 2287 阅读 · 0 评论 -
程序运行为什么需要内存
计算机程序运行的目的计算机为什么需要编程?编程已经编了很多年,已经写了很多程序,为什么还需要另外写程序?计算机有这个新的程序到底为了什么?程序的目的是为了去运行,程序运行是为了得到一定的结果。计算机就是用来计算的,所有的计算机程序其实都是在做计算。计算就是在计算数据。所以计算机程序中很重要的部分就是数据。计算机程序 = 代码 + 数据计算机程序运行完得到一个结果,就是说:代码 + 数据 (经过运行后) = 结果从宏观上来理解,代码就是动作,就是加工数据的动作;数据就是数字,就是被代码所加工的东西。原创 2021-03-02 11:15:11 · 1270 阅读 · 0 评论