C语言 & 数据结构
寒风1999
每一个不曾拼搏的今天都是对明天的辜负
展开
-
4.2.二维数组和它的指针
这片文章介绍二维数组int a[ i ] [ j ]中的符号:a,&a[ i ],&a[ i ][ j ],a[ i ][ j ],&a[ i ] [ j ]的含义,重点在后面第二部分的分析,但是前面第一部分的复习数组指针,指针数组和二维指针是前提,前面的不会,后面的没法理解。这片文章写的有些费劲,个人能力不够,可能会有错误,希望各位朋友能够指正,共同进步。//握手一:先回顾一下数组指针,指针数组,原创 2016-06-30 20:31:13 · 502 阅读 · 0 评论 -
3.3.const关键字和指针的纠缠
const关键字定义的变量#include<stdio.h>int main( void ){ const int a = 10; a = 20;}结果怎样?编译错误 [Error] assignment of read-only variable ‘a’ 变量a是只读的。得到一个结论,使用const修饰的变量是常量,我们无法修改。在gcc中把const常量放到了dat原创 2016-06-14 23:01:45 · 382 阅读 · 0 评论 -
4.3.函数指针
在Linux 内核中经常看见,数组指针,指针数组,函数指针等,这些都是C语言的高级语法,之前我们了解了数组指针和指针数组,在学习他们的过程中使用逐层分析的方法,这回我们使用这个方法再来学习函数指针。 1.函数指针是什么? 1.1.概念理解 (1)函数指针、数组指针、普通指针之间并没有本质区别,区别在于指针指向的东西是个什么玩意。 (2)函数的实质是一段代码,这一段代码在内存中是连续分布的(一原创 2016-07-02 17:49:04 · 339 阅读 · 0 评论 -
4.4.C语言的陷阱之typedef
typedef是一个关键字,可以重命名一些数据类型也可以重定义一些新的数据类型。我们从以下几个角度去理解typedef。1.typedef和普通数据类型类型typedef int MYINT;int a = 10;MYINT B = 20;我们给int重命名成MYINT,这时候 int 和MYINT 是一样的,都可以定义变量,并且在32位平台都是32位的。2.typedef和结构体(重点)str原创 2016-07-02 17:55:09 · 362 阅读 · 0 评论 -
3.4.数组和指针的关联
1.从内存和编译器角度来理解数组1.1内存角度和编译器角度(1)定义五个变量,普通定义int a,b,c,d,e;和数组定义int a[5]; 1.都是定义了五个变量,第一种方法定义的变量的内存地址不一定是连续的,第二种方法定义的元素一定是地址连续的。 2.对于编译器来说,定义数组和定义其他变量的本质都是一样的。1.2来理解一些符号 a,a[0],&a,&a[0]分别和左值右值的关系分析原创 2016-06-17 21:16:38 · 431 阅读 · 0 评论 -
6.1.预处理都做了什么
由我们写好的源代码到CPU可以认识并执行的二进制中间发生了很多事,我们来深入探讨一下C语言的预处理。1.从源代码到可执行程序的过程 (1)源代码.c文件先经过预处理器,生成一个中间文件.i文件 (2).i文件经过编译生成汇编.s文件 (3).s的汇编文件经过汇编器生成.o的目标文件 (4).o的目标文件经过链接器生成.elf可执行程序 每一步都有其相应的工具,预处理有预处理器,编译有编译原创 2016-07-15 20:33:56 · 2885 阅读 · 1 评论 -
5.1.堆、栈、数据区、bss、代码段
一个程序的运行是需要内存的,那么我们平常写的程序的内存都是怎么分配的呢?都是在一起存放?还是分开?按照什么规律呢?预备知识: (1)首先我们要知道,内存是真实存在的,内存是一个物理器件。它时由操作系统管理的,我们平常只要使用它就行了,为了方便管理。操作系统提供了很多种机制来管理内存,每一种机制都有其特点。 (2)三种内存来源:栈(stack)、堆(heap)、数据区(data) (3)我原创 2016-07-16 19:45:34 · 523 阅读 · 0 评论 -
3.5.指针的强制类型转换
1.什么是数据类型?数据类型的作用是什么?int a = 10; int数据类型规定了变量a的大小的存储方式。数据类型就只有两种作用,内存那么大,如何进行分配使用,都是靠数据类型。 int short char 数据类型的存储方式相同,只是所规定的内存大小不同,而float 和double和他们都不同。2.指针的数据类型是什么? 准确的来说,指针是没有数据类型的,所有的指针的类型都原创 2016-06-21 21:38:03 · 538 阅读 · 0 评论 -
3.6.数组、指针与sizeof( ) 运算符
这篇文章主要介绍sizeof( )运算符的用法 1. sizeof() 和 strlen() (1) sizeof()是一个运算符,如同加减乘除,返回数据类型或者变量的内存大小。 (2) strlen()是一个C库函数,返回字符串的长度。 2.char str[] = “hello”sizeof(str) //str在这既不做左值也不做右值,代表数组的所有大小,字符串原创 2016-06-21 21:43:25 · 469 阅读 · 0 评论 -
4.6宏定义之带参宏
//本文为转载,具体出处已经找不到了。这里引用为了知识传播。感谢原作者。C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数,这点和函数有些类似。就像把函数的实参传递给形参。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。带参宏定义的一般形式为: #define 宏名(形参列表) 字符串 在字符串中含有各个形参。带参宏调用的一般形式为: 宏名(实参列转载 2017-05-10 14:24:54 · 645 阅读 · 1 评论 -
用宏定义来完成位运算
2.5.技术升级:用宏定义来完成位运算直接用宏来置位、复位(最右边为第1位),我们先来看看最终结果是什么样的,然后我们再来一步一步的分析// 把x的第n位置一 #define SET_NTH_BIT(x, n) (x | ((1U)<<(n-1)))//把x的第n位清零 #define CLEAR_NTH_BIT(x, n) (x & ~((1U)<<(n-1)))//把x的n-m原创 2016-06-03 18:17:46 · 1203 阅读 · 0 评论 -
4.1.数组指针和指针数组和二重指针
数组指针和指针数组从字面上来看很纠结,有时候我也搞不清,分不清哪样的是数组指针,哪样的是指针数组。这东西就不是靠记忆的,我们采取分析加对比分层剥离的方法分析。1.概念区别 1.1.数组指针:定语在前,主语在后。也就是数组的指针。一个指针,它指向一个数组。 1.2.指针数组:定语在前,主语在后。也就是指针 的数组。一个数组,里面的元素都是指针。2.指针和数组分别定义的符号 2.1 i原创 2016-06-30 20:23:57 · 1821 阅读 · 0 评论 -
3.2.小心野指针
什么是野指针?通过一段代码来体会一下。#include<stdio.h>int main(void){ int * p ; *p = 314; printf("*p = %d\n",*p);}看看打印的值是多少?是314吗?程序运行出错了,为什么?回想一下局部变量的特点:1.分配在栈上,2.若未初始化,其值为垃圾值。这里的指针变量 p 也是局部变量,p为经初始化,p保留的原创 2016-06-14 22:51:46 · 418 阅读 · 0 评论 -
3.1.深入理解指针1--什么是指针、指针符号 & *
指针和普通变量的身份低位一样,本质没有区别,指针的本质就是变量。指针全名就是指针变量。这句话写在最前面就是告诉大家,指针并没有什么特殊的,这样我们才能平心静气的去“搞”它。1.什么是指针?#include<stdio.h>int main(void){ int a = 0; float b = 3.14; char c = 'a'; }分析: 变量 a 的数据原创 2016-06-06 19:52:41 · 1269 阅读 · 0 评论 -
1.4.C语言如何操作内存
1.5.C语言如何操作内存知识点1.C语言对地址的封装(通过变量访问内存)(1)int a; 把变量a和某个地址绑定,当编译器看到int a这句话时,第一步:通过int确定要分配的变量的内存地址的大小,并记录该地址,第二步:看到a这个变量名,把刚刚记录下来的地址和变量a绑定起来,以后要找某一个地址的内容时就找与之对应的变量,这样一来,对于我们来说,在使用数据的时候不用记住哪一个数据原创 2016-04-25 17:45:18 · 595 阅读 · 0 评论 -
1.6.什么是栈(stack)
1.6.什么是栈(stack)栈是一种数据结构,使用栈来保存局部变量.栈是管理内存的一种方式,站务管理内存的甜地丁有很多,比如内存小,自动化,因为栈的分配的释放全是由操作系统完成的,我们只管使用就行。栈有一些特点比如:先进后出,入口即出口,栈应用很广泛。好像黑客都很爱玩栈。(1)栈的应用举例:局部变量。C语言中的局部变量是用栈来实现的,定义一个局部变量int a=10;时,编译原创 2016-04-25 17:37:23 · 395 阅读 · 0 评论 -
1.8.程序的内存分配
一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(stati转载 2016-04-25 23:17:44 · 302 阅读 · 0 评论 -
1.7.什么是堆(heap)
1.7.什么是堆(heap)栈和堆不得不结合起来谈论,说一下这两种内存管理方式的使用过程,首先,电脑可能有好多个进程,操作系统事先给每一个进程分配一个栈,供每个程序中的局部变量使用,当程序在运行过程中,发现自带的栈不够用了,或者需要大块的内存来使用了,这时候就要分配堆内存了。在来说一说栈和堆的各自优点。栈是系统自动分配、释放的,不需要手动干预,当定义了一个局部变量时,自动就使用栈了。堆是由原创 2016-04-27 18:05:02 · 401 阅读 · 0 评论 -
1.5.初步体验结构体
1.5.初步体验结构体结构体是由数组演变过来的,弥补了数组的一些缺点,数组的缺点:1:数组大小一旦被定义在程序运行过程中不能在改变,只能存放相同类型的数据,而结构体中的成员可以类型不同,但是在运行过程中结构体的大小也是不能改变的。知识点:(1)结构体定义和使用: struct mystruct { char mark;原创 2016-04-25 17:41:25 · 389 阅读 · 0 评论 -
2.4.位运算实战演练1
2.4.位运算实战演练11.给一个整形数a,设置a的bit3,保证其他位不变 分析: 第一步:设置 a 的 bit3 a | = 1<<32.给一个整形数a,设置a的bit3-bit7,保证其他位不变 分析: 第一步:从bit3 -bit7共5位 ,先设置bit0-bit4 第二步:bit0-bit4左移到bit3-bit7 第三步:寄原创 2016-05-30 22:39:23 · 337 阅读 · 0 评论 -
2.3.如何构建寄存器中特定二进制数
如何构建寄存器中特定二进制数在ARM中寄存器按照位进行操作。寄存器的每一位都是不同的功能,如何给特定的一位写入值而不改变其他位?在ARM中这些都是通过位运算来完成的。原创 2016-05-17 20:48:37 · 775 阅读 · 0 评论 -
1.2.位、字节、半字、字、内存位宽
1.2.位,字节,半字、字.内存位宽知识点1.什么是内存 (1)硬件上:内存条是电脑上的一个配件,根据不同硬件实现原理可以把内存分为DRAM SRAM(上一章博客提到了静态内存和动态内存)动态还是静态是硬件的特性,和硬件设计原理有关。 (2)逻辑上:可以随机访问任意一个地址的内容,并且可以对其地址内容进行读写 2.内存的逻辑抽象图(也就是内存的编程模型)原创 2016-04-24 18:23:05 · 1763 阅读 · 0 评论 -
1.1.程序运行为什么需要内存
1.1.程序运行为什么需要内存程序运行的过程就是电脑在不断地进行计算,在计算过程中需要各种数据(也就是变量),程序运行需要数据(变量)和代码共同支持,代码就是函数,它负责指令,在执行这些指令的过程中就需要产生一些数据(变量)。知识点:1:冯诺依曼结构:代码和数据存放在一起 哈弗结构:代码和数据分开存放。代码存储在flash中,数据存储在RAM中。2:代码就是函数,数据原创 2016-04-24 17:49:20 · 1593 阅读 · 1 评论 -
2.1.常用位操作符
2.1.常用位操作符原创 2016-05-09 15:20:14 · 441 阅读 · 0 评论 -
2.2.位与位或位异或在操作寄存器时的特殊作用
2.2.位与位或位异或在操作单片机寄存器时的特殊作用原创 2016-05-09 17:55:22 · 1659 阅读 · 0 评论 -
1.3.内存编址和寻址以及内存对齐
1.3.内存编址和寻址以及内存对齐原创 2016-04-25 10:45:28 · 1451 阅读 · 0 评论