指针变量

C/C++ 复习

末鹿安然 提交于 2020-01-05 04:23:10
本文总结一下C++面试时常遇到的问题。C++面试中,主要涉及的考点有 关键字极其用法,常考的关键字有const, sizeof, typedef, inline, static, extern, new, delete等等 语法问题 类型转换 指针以及指针和引用的区别 面向对象的相关问题,如虚函数机制等 泛型编程的相关问题,如模板和函数的区别等 内存管理,如字节对齐(内存对齐)、动态内存管理、内存泄漏等 编译和链接 实现函数和类 本文不涉及STL的内容,有关STL的内容,会另有一篇文章专门总结。 零、序章 0.1 C++与C的对比 C++有三种编程方式:过程性,面向对象,泛型编程。 C++函数符号由 函数名+参数类型 组成,C只有函数名。所以,C没有函数重载的概念。 C++ 在 C的基础上增加了封装、继承、多态的概念 C++增加了泛型编程 C++增加了异常处理,C没有异常处理 C++增加了bool型 C++允许无名的函数形参(如果这个形参没有被用到的话) C允许main函数调用自己 C++支持默认参数,C不支持 C语言中,局部变量必须在函数开头定义,不允许类似for(int a = 0; ;;)这种定义方法。 C++增加了引用 C允许变长数组,C++不允许 C中函数原型可选,C++中在调用之前必须声明函数原型 C++增加了STL标准模板库来支持数据结构和算法 一

Debug与Release版本的区别

房东的猫 提交于 2020-01-05 02:33:35
  Debug 和 Release 并没有本质的区别,他们只是VC预定义提供的两组编译选项的集合,编译器只是按照预定的选项行动。如果我们愿意,我们完全可以把Debug和Release的行为完全颠倒过来。当然也可以提供其他的模式,例如自己定义一组编译选项,然后命名为MY_ABC等。习惯上,我们仍然更愿意使用VC已经定义好的名称。   Debug版本包括调试信息,所以要比Release版本大很多(可能大数百K至数M)。至于是否需要DLL支持,主要看你采用的编译选项。如果是基于 ATL的,则Debug和Release版本对DLL的要求差不多。如果采用的编译选项为使用MFC动态库,则需要MFC42D.DLL等库支持,而 Release版本需要MFC42.DLL支持。Release不对源代码进行调试,不考虑MFC的诊断宏,使用的是 MFC Release库,编译时对应用程序的速度进行优化,而Debug则正好相反,它允许对源代码进行调试,可以定义和使用MFC的 诊断宏,采用MFC Debug库,对速度没有优化。   既然Debug和 Release仅仅是编译选项的不同,那么为什么要区分Debug和Release版本呢?   Debug和Release,在我看来主要是针对其面 向的目标不同的而进行区分的。Debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息

C++与Java语法上的不同

蹲街弑〆低调 提交于 2020-01-05 01:35:45
最近学习算法和刷题基本都是用C++写的程序,在这个过程中,发现C++和Java在语法上有很多相同点,但也有很多不同点,而这些不同点对于已经掌握Java的程序员来说,理解C++代码可能会有些吃力甚至困难,在踩过了一个又一个坑后,我决定把这些不同记录下来,可能涵盖的不是很全,所以本文会持续更新。 零、目录 1. new关键字 2. C++实例化对象的几种方式 3. C++初始化表达式 4. C++构造函数后的冒号 5. C++中难以省略的分号; 6. C++中的:: 7. C++中的*、&、-> 8. C++函数前或者函数后的const 9. delete完成后需要将指针置为NULL 一、new关键字 // C++中: MyClass* a = new MyClass(); delete a; // Java中: MyClass a = new MyClass(); C++中new关键字实例化对象之后返回的是一个对象的指针,所以需要定义指针;而Java中定义对象时返回的其实也是一个指针(引用),但是在Java中不需要显示的定义指针。 不同点 C++中通过new关键字实例化的对象在使用完毕后需要使用delete关键字手动释放内存;而Java中由于垃圾回收机制的存在,我们无需手动释放内存。 二、C++实例化对象的两种方式 // 方式一 MyClass* a = new MyClass();

指针基本概念分析

﹥>﹥吖頭↗ 提交于 2020-01-04 09:07:15
文章目录 1 指针 1.1 *号的意义 1.2 传值调用与传址调用 1 指针 1.1 *号的意义 *号: 在指针声明时,*号表示所声明的变量为指针。 在指针使用时,*号表示取指针所指向的内存空间中的值。 小贴士: 对于指针我们需要知道: 指针是C语言中一种特别的变量。 指针所保存的值是内存的地址。 可以通过修改指针修改内存中的任意地址内容。 1.2 传值调用与传址调用 传值调用与传址调用: 指针是变量,因此可以声明指针参数。 当一个函数体内部需要改变实参的值,则需要使用指针参数。 函数调用时实参值将复制到形参。 指针适用于复杂数据类型作为参数的函数中。 # include <stdio.h> int swap ( int * a , int * b ) { int c = * a ; * a = * b ; * b = c ; } int main ( ) { int aa = 1 ; int bb = 2 ; printf ( "aa = %d, bb = %d\n" , aa , bb ) ; swap ( & aa , & bb ) ; printf ( "aa = %d, bb = %d\n" , aa , bb ) ; return 0 ; } 参考资料: C语言进阶剖析教程 来源: CSDN 作者: SlowIsFastLemon 链接: https://blog

动态内存分配与指向它的指针变量

谁说我不能喝 提交于 2020-01-04 05:49:44
1.动态内存分配的含义   c语言允许建立动态内存分配区域,以存放一些临时用的数据,这些数据不必再程序的声明部分定义,也不必等到函数结束时才释放,而是要随时开辟,不需要随时释放,这些数据是临时存放在一个特定的自由存储区(堆),可以根据需要向系统申请所需要大小的空间,由于未在声明部分定义它们为变量或数组,因此不能通过变量名或数组名去引用这些数据,只能通过指针来引用。 2.建立内存的动态分配   对内存的动态分配是通过系统提供的函数库来实现的,主要有malloc,calloc,free,realloc这四个函数: (1).使用malloc函数   其函数原型为void *malloc(unsigned int size);   其作用是在内存的动态存储区域中分配一个长度为size的连续空间,形参size的类型定义为无符号整形(不允许为负数)。次函数的值(即返回值)是所分配区域的第一个字节的地址,或者说,次函数是一个指针型函数,返回的指针指向该分配区域的开头位置,如:   malloc(100)//开辟100字节的临时分配区域,函数值为其第一个字节的地址   注意其指针的基类型为void,即不能执行任何类型的数据,只能提供一个地址,如果此函数未能成功执行(如内存空间不足),则返回空指针。 (2).使用calloc函数   其函数原型为void *calloc(unsigned n,

指针的使用

回眸只為那壹抹淺笑 提交于 2020-01-04 05:49:15
学习链接: http://www.icourse163.org/learn/ZJU-200001?tid=1002316004#/learn/content?type=detail&id=1003086473&cid=1003636045 指针的应用场景 1.交换两个变量 2.函数返回多个值,某些值就只能通过指针返回   传入的参数实际上是需要保存带回的结果的变量 3.函数返回运算的状态,结果通过指针返回 传入函数的数组成了什么? 函数参数表中的数组实际上是指针   sizeof(a)=sizeof(int *) 但是可以用数组的运算符[]进行运算 数组参数 以下四种函数原型是等价的: int sum(int *ar, int n) int sum(int *,int) int sum(int ar[], int n) int sum(int [],int) 数组变量是特殊的指针 数组变量本身表达地址,所以   int a[10]; int *p=a;   但是数组的单元表达的是变量,需要用&取地址   a==&a[0] []运算符可以对数组做也可以对指针做:   p[0]<==>a[0] *运算符可以对指针做,也可以对数组做   *a=25 数组变量是const的指针,所以不能被赋值 int a[] -->int * const a 指针与const 指针是const

C语言指针与数组

亡梦爱人 提交于 2020-01-04 05:49:02
C语言指针与数组 数组的下标应该从0还是1开始? 我提议的妥协方案是0.5,可惜他们未予认真考虑便一口回绝 -- Stan Kelly-Bootle 1. 数组并非指针 为什么很多人会认为指针和数组始终应该可以互换的呢? 因为对数组的引用总是可以写成对指针的引用,而且确实存在一种指针和数组的定义完全相同的上下文环境, 不幸的是,这只是数组的一种极为普通的用法,并非所用情况下都是如此。 2. 什么是声明,什么是定义 C语言中对象必须有且只有一个定义,但它可以有多个extern声明. 定义:只能出现在一个地方, 确定对象的类型并分配内存 ,用于创建新的对象,例如 int a[100] 声明:可以多次出现,描述对象的类型,用于指代其他地方定义的对象(例如在其他文件里) 例如 extern int a[100] extern对象声明告诉编译器对象的类型和名字,对象的内存分配则在别处进行 3. 数组与指针的区别 出现在赋值左边的符号被称为 左值, 出现在赋值右边的符号被称为 右值。 编译器为每个变量分配一个地址(左值),这个地址在编译时可知,并且该变量在运行时一直保存于这个地址中。 存储于变量中的值(右值)只有在运行时才可知,如果需要用到变量中存储的值,编译器就发出指令从指定地址读入变量并将它存于寄存器中。 例如: char a[9] = "abcdefgh"; c = a[i]

数组、字符串和指针

会有一股神秘感。 提交于 2020-01-04 05:48:46
1.如何使用数组   数组就是一组名为数组元素或简称元素的内存位置,各个内存位置可以存储相同数据类型的数据项,而我们可以用相同的变量名引用所有内存位置。 2.如何声明和初始化不同类型的数组   声明数组:例如 long height[6];   初始化数组:例如 int engine_size[5] = {200, 250, 300, 350, 400};   C++11标准定义了一种表示一组初始值的新的统一方式,对于用这种方式初始化的所有对象,这些初始值都是相同的,包括标准模板库容器和数组。   例如:int value[]{2,3,4}; 有了这种语法,=操作符就是不必要的。 3.如何对数组使用基于范围的for循环   例如: double temperatures[] = {65.5, 68.0, 75.0, 77.5, 76.4, 73.8, 80.1};       double sum = 0.0;       int count = 0;       for(double t : temperatures){         sum += t;         ++count;       }       double average = sum/count;   还可以使用auto关键字来编写该循环:     for(auto temperature :

指针和动态数组 new ,delete

╄→гoц情女王★ 提交于 2020-01-04 05:48:30
............心中要有一内存块,以便理解知识 计算机储存数据必须知道数据的3种属性: 1.存储在何处.......并起名 2.值 3.类型 (1)int a;a=30; (2)int *b=&a; (3).int *a,b;注意...整型....指针a,整型...变量b,对每个指针都要有一个*; .......................指针.......................................... 1.指针是一个变量,存储的是...值的地址,而不是值本身, 指针变量 是指向特定变量类型指针,和数组相似 ..int* tax;...............指向int变量的指针,又叫整型指针 ..double * str;.............指向double变量的指针 ..int 指针和double指针虽然指向的数据类型不同, 但这两个变量本身长度的通常是一样的,好比1016可能是超市的地址,也可能是,村庄的地址一样,.....地址的长度或值,不能指示该地址上有什么建筑物,也不指示有关变量的长度或类型的任何信息 .显示地址,cout常用16进制 .......................指针与c++原理.......................................... oop强调的是运行阶段进行决策; 如

指针知识(三):指针与数组

自作多情 提交于 2020-01-04 05:47:52
数组的概念与指针的概念联系非常解密。其实 数组的标识 相当于它的 第一个元素的地址 ,如:int a[5],数组名a指向它的第一个元素a[0]的地址。 有语句如下: int a[5]; int * p; 下面的赋值为合法的: p = a; 这里指针p 和a 是等价的,它们有相同的属性,唯一的不同是我们可以给指针p赋其它的数值,而a 总是指向被定义的5个整数组中的第一个。所以,p只是一个普通的指针变量,而与之不同,a 是一个指针常量(constant pointer),数组名的确是一个指针常量。因此虽然前面的赋值表达式是合法的,但下面的不是: a = p; 因为a 是一个数组(指针常量),常量标识不可以被赋其它数值。 由于变量的特性,以下例子中所有包含指针的表达式都是合法的: #include <iostream> using namespace std; int main() { int a[5]; int *p; p = a;      //p是a[0]的地址,因a指向a的首地址,即指向a[0], *p = 10;    //即a[0]=10 p++; *p = 20;   //a[1]=20 p = &a[2]; *p = 30;   //a[2]=30; p = a +3; *p = 40;    //a[3]=40 p = a; *(p+4) = 50; //a[4]=50