c语言指针

数据结构学习总结 栈和队列

你离开我真会死。 提交于 2019-12-01 09:00:31
一,顺序栈的基本操作 同 顺序表 和 链表 一样,栈也是用来存储逻辑关系为 "一对一" 数据的线性存储结构,如 图 1 所示。 图 1 栈存储结构示意图   从图 1 我们看到,栈存储结构与之前所学的线性存储结构有所差异,这缘于栈对数据 "存" 和 "取" 的过程有特殊的要求: 1,栈只能从表的一端存取数据,另一端是封闭的,如图 1 所示; 2,在栈中,无论是存数据还是取数据,都必须遵循"先进后出"的原则,即最先进栈的元素最后出栈。拿图 1 的栈来说,从图中数据的存储状态可判断出,元素 1 是最先进的栈。因此,当需要从栈 中取出元素 1 时,根据"先进后出"的原则,需提前将元素 3 和元素 2 从栈中取出,然后才能成功取出元素 1。      因此,我们可以给栈下一个定义,即栈是一种只能从表的一端存取数据且遵循 "先进后出" 原则的线性存储结构。    通常,栈的开口端被称为 栈顶 ,封口端被称为 栈底 ; 因此,栈顶元素指的就是距离栈顶最近的元素,拿图 2 来说,栈顶元素为元素 4;同理,栈底元素指的是位于栈最底部的元素,图 2 中的栈底元素为元素 1。                                                图 2 栈顶和栈底 进栈和出栈 基于 栈结构的特点,在实际应用中,通常只会对栈执行以下两种操作: 向栈中添加元素,此过程被称为"进栈"

宏定义和内存分配

天大地大妈咪最大 提交于 2019-12-01 08:31:16
代码想转换成.exe文件,需要经过几个步骤: 替换 ->为了可读性或方便,使用了一些宏定义;在编译前,会有一个工具将宏定义的符号替换成相应的值; 编译 ->将代码转成二进制文件; 连接 ->代码中可能用到了别人写的程序,连接就是将别人的程序复制一份放到自己的程序中; 1.宏定义 1)无参数的宏定义 无参数的宏定义的一般形式为:# define 标识符 字符序列 例如: 注意: 1、只作字符序列的替换工作,不作任何语法的检查 2、如果宏定义不当,错误要到预处理之后的编译阶段才能发现 2)带参数的宏定义 带参数宏定义:#define 标识符(参数表)字符序列 例如: # define MAX(A,B) ((A) > (B)?(A):(B)) 代码 x= MAX( p, q)将被替换成 y=((p) >(q)?(p):(q) 好处是:如果直接定义一个相同功能的函数,在执行是必须给函数分配内存空间,而宏定义是替换代码,不需要给子函数分配空间; 注意: 1、宏名标识符与左圆括号之间不允许有空白符,应紧接在一起.否则会被当做不带参数的宏括号后面的参数被当做该符号的值 2、宏与函数的区别:函数分配额外的堆栈空间,而宏只是替换. 3、为了避免出错,宏定义中给形参加上括号. 4、末尾不需要分号. 5、define可以替代多行的代码,记得后面加 \ #define MALLOC(n,type)\ (

c语言 指针

白昼怎懂夜的黑 提交于 2019-12-01 05:42:27
指针:c语言的一种高级数据类型,指针的数据类型变量是用来存放其他变量的内存地址,达到间接访问另一个变量的目的; 更加方便对数组和字符串的操作;以及函数调用中相互传递数据 。 一:变量的指针 #include<stdio.h> int main() { int a,b,t,* p1,* p2,* p; p1 = &a; p2 = &b; //指针的读取,p1直接指向地址 scanf("%d",p1); printf("a=%d,a=%d\n",a,* p1); //利用指针进行运算 b = 5; * p2= * p2 + 5; printf("b=%d,b=%d\n",b,* p2); // 利用指针进行替换操作 p = p1; p1 = p2; p2 = p; printf("a=%d,b=%d\n",* p1,* p2); return 0; } 二:数组指针 ①一维数组 #include<stdio.h> #define N 5 int main() { int a[N],* p,i; int sum=0; float aver; p = a; //利用指针计算求和 for(i=0;i<N;i++){ scanf("%d",p+i); sum += * (p+i); } aver = sum*1.0 /N; //利用循环找大于平均值 for(i=0;i<N;i++){ if(*

浅析指针

蹲街弑〆低调 提交于 2019-12-01 01:42:56
内存地址(普通指针)或偏移地址(成员指针)。 指向变量的指针,是数据内存的地址,指向函数的指针是代码内存的地址,指向数据的指针指向数组开始位置的地址。 抽象点说,就是以一种统一的方式产生对不同数据结构的元素的引用 理解指针要注意以下几个点: -- 每个指针都有类型,类型决定指针移动时的步长(假设可移动:++ / -- / +n / -n) -- 从内容上讲,指针就是地址,尤其是在机器级层面上 -- 对指针进行类型转换,仅仅是改变了解释指针所指内存区域的方式,位模式没有变 -- 指针可以指向函数,其值是函数对应机器代码的第一条指令的地址 -- 指针和数组关系暧昧,如果你明白比例变址寻址,你就能清除数组名,下标,指针类型之间的关系,简单说:数组名即基地址(立即数),下标即变址,指针类型即比例因子,而指针的值就是:偏移量 + 变址 * 比例因子 +基地址【IA32】,这样你就明白数组名是个常量(在机器眼里就是个 立即数 ,寻址时对变址没有限制也就说明了C语言对下标越界不检查) 指针是储存地址的一个变量 指针变量储存的就是一个地址, 可以有如下行为:   * 改变该变量的值;   * 取得该变量的值 这和其他变量是一样的, 但是指针还可以做到:   * 改变该变量指向的那个地址的值   * 取得该变量指向的地址的值 这只是编译器赋予指针的特定行为而已(通过& * 等语法),

内存四区详解

佐手、 提交于 2019-12-01 01:37:30
C语言内存四区:代码区、数据区、栈区、堆区 1.代码区(.text):代码区中主要存放程序中的代码(二进制),属性是只读。 2.数据区(静态存储区):主要包括静态全局区和常量区,如果要站在汇编角度细分的话还可以分为很多小的区。 A.全局区(静态区,static):全局变量和静态变量的存储是放在一块的,初始化的(全局变量和静态变量)在一块区域(.data,显示初始化为非零的全局变量), 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(.bss,显式初始化为0或者并未显式初始化)。 程序结束后有系统释放。 B.常量区 :常量字符串就是放在这里的。(常量、函数名、关键字、字符串等) 程序结束后由系统释放。 3.栈区(stack):内存的分配和释放都是自动进行 ,存放函数的参数值,局部变量的值等。栈内存分配运算内置于处理器的指令集中,效率高,但容量有限,局部变量生命周期短。(linux中查看栈大小,ulimit -s,本机8M) 4.堆区(heap):有些操作对象只有在程序运行时才能确定,这样编译器在编译时无法为他们预先分配内存空间,只有在程序运行时分配,所以称为动态内存,malloc/free等。 动态内存的申请和释放 #include <stdlib.h> void *malloc(size_t size); malloc工作机制: malloc函数的实质体现在

C语言强化_day02

我与影子孤独终老i 提交于 2019-11-30 23:51:17
typedef int A[10];//A;数组类型 A b;//int b[10],数组类型变量,普通变量 A *p;//数组类型定义数组指针变量 typedef int (*P)[10];//数组指针类型 P p;//数组指针变量 int (*q)[10];//数组指针变量 一、数组指针和指针数组 指针数组;是一个数组,数组每个元素都是指针 //[]优先级比*高,main函数里面的char *argv[]就是一个指针数组 数组指针;是指向一个数组的指针 (指向一维数组整个数组而不是数组首元素地址) 定义数组指针变量的三种方式 // 1,先定义数组类型,再根据类型定义指针变量。//2,typedef int A[10];//A数组类型 //3,A *p = NULL;//P数组指针类型变量 //4,int a[10],a代表首元素地址,&a代表整个数组首地址(数组指针,数组多长跳多长) 先定义指针数组类型,再根据类型定义变量 //和指针数组写法类似,多了()。()和[]优先级一样,从左到 右。()有指针,他是一个指针,[]。指向数组的指针,它有typedef,所以他是一个数组指针类型。//int a[10],typedef int (*p)[10](10为 步长,需要与数组一致),p q;q = &a; 直接定义数组指针变量 //int (*q)[10]; 来源: https:/

深入理解C语言指针

百般思念 提交于 2019-11-30 21:55:23
一、指针的概念 要知道指针的概念,要先了解变量在内存中如何存储的。在存储时,内存被分为一块一块的。每一块都有一个特有的编号。而这个编号可以暂时理解为指针,就像酒店的门牌号一样。 1.1、变量和地址 先写一段简单的代码: void main(){ int x = 10, int y = 20; } 这段代码非常简单,就是两个变量的声明,分别赋值了 10、20。我们把内存当做一个酒店,而每个房间就是一块内存。那么“int x = 10;”和“int y = 20;”的实际含义如下: 去酒店订了两个房间,门牌号暂时用 px、py 表示 让 10 住进 px,让 20 住进 py 其中门牌号就是 px、py 就是 变量的地址 x 和 y 在这里可以理解为具体的房间,房间 x 的门牌号(地址)是 px,房间 y 的门牌号(地址)是 py。而 10 和 20,通过 px、py 两个门牌,找到房间,住进 x、y。 1.2、指针变量和指针的类型 指针变量就是一个变量,它存储的内容是一个指针。如果用前面的例子,可以理解为指针变量就是一张房卡,房卡存储了房间号的信息。 在我们定义一个变量的时候,要确定它的类型。int x、char ch、float、、、在定义指针变量时也是一样的,必须确定指针类型。int 变量的指针需要用 int 类型的指针存储,float 变量的指针需要用 float

c语言中的const的作用及解析

偶尔善良 提交于 2019-11-30 20:55:33
有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定。例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小。为了满足这一要求,可以使用 const 关键字对变量加以限定: const int MaxNum = 100 ; //班级的最大人数 这样 MaxNum 的值就不能被修改了,任何对 MaxNum 赋值的行为都将引发错误: MaxNum = 90 ; //错误,试图向 const 变量写入数据 我们经常将 const 变量称为常量(Constant)。创建常量的格式通常为: const type name = value; const 和 type 都是用来修饰变量的,它们的位置可以互换,也就是将 type 放在 const 前面: type const name = value; 但我们通常采用第一种方式,不采用第二种方式。另外建议将常量名的首字母大写,以提醒程序员这是个常量。 由于常量一旦被创建后其值就不能再改变,所以常量必须在定义的同时赋值(初始化),后面的任何赋值行为都将引发错误。一如既往,初始化常量可以使用任意形式的表达式,如下所示: #include <stdio.h> int getNum () { return 100 ; } int main () { int n = 90 ; const int MaxNum1 = getNum

整理

牧云@^-^@ 提交于 2019-11-30 19:52:48
C++11 知识整理 对class的理解 答:首先,class 也是一种数据类型,只不过是可以由开发者自由定义的一种数据类型;可以用来封装成员变量和成员函数;支持抽象,继承,多态性;在定义数据类型的时候,private,public,也从一定程度上保证了数据的安全性 抽象性:含有纯虚函数的类被称为抽象类,用途是为派生类提供基类 多态性:对于不同对象接受相同信息时产生不同的动作。分为静态多态和动态多态,体现在两个方面,一是在编译的时候,函数重载是一个方面;二是在运行的时候,虚函数是一个方面 继承性:子类具有父类的各种属性和方法,而不必再次编写相同的代码 什么是类 答:一种将抽象转换成用于定义的类型的工具,将数据表示方法和操纵这些数据的方法组合一起整合成一个包 如何将私有成员变量取出 答:方法1:通过public中的函数,传出参数将私有成员变量取出。方法2:友元函数 *this 指针 答:经典回答,进入一个房间,能看见房间里的东西,但是整个房间看不到了,然后this指针就是时刻盯着这整个房间。this指针是类的一个自动生成,自动隐藏的私有成员。存在于类的非静态成员函数中,指向内调用函数所在的对象。全局仅有一个this指针,当一个对象被创建的时候,this指针就存放指向对象数据的首地址 类和对象的区别和联系 答:区别:(1).定义不同 ,类是现实世界或思维世界的实体在计算机的反映

static_cast与dynamic_cast转换

时间秒杀一切 提交于 2019-11-30 17:14:22
一 C 语言中存在着两种类型转换: 隐式转换和显式转换 隐式转换:不同数据类型之间赋值和运算,函数调用传递参数……编译器完成 char ch; int i = ch; 显示转换:在类型前增加 :(Type)变量 对变量进行的转换。用户显式增加 char *pc = ( char *)pb; void *ps = ( void *)pa; 二 C++ 中的类型转换   通过这两种方式,C语言中大部分的类型转换都可以顺利进行。 至于能不能进行转换,转换后的结果如何,编译器不管需要用户自己去控制。   C++继承了C中的隐式和显式转换的方式。但这种转换并不是安全和严格的, 加上C++本身对象模型的复杂性,C++增加了四个显示转换的关键字。(C++是强类型语言) ( static_cast , dynamic_cast , const_static , reinterpret_cast ) 1 static_cast (1 )用于基本的数据类型转换(char ,int ),及指针之间的转换 test_enum type = test_enum_1; char a ; int b = static_cast < int >(a); char c = static_cast < char >(b); type = static_cast <test_enum>(b); char * pa =