指针

从数组到链表2

拜拜、爱过 提交于 2020-02-06 10:51:29
从数组到链表2 理想的情况是,用户可以不确定地添加数据(或者不断添加数据直到用完内存量),而不是先指定要输入多少项,也不用程序分配多余的空间。这可以通过在输入每一项后调用malloc()分配正好能储存该项的空间。如果用户输入3部影片,程序就调用malloc()3次;如果用户输入300部影片,程序就调用malloc()300次。 不过我们又制造了一个麻烦。比较一下一种方法是调用malloc()一次,为300个filem结构请求分配足够的空间;另一种方法是调用malloc()300次,分别为每个file结构请求分配足够的空间。前者分配的是连续的内存块,只需要一个单独的指向struct变量的指针,该指针指向已分配块中的第一个结构。简单的数组表示法让指针访问块中的每个结构,如前面代码段所示。第二种方法的问题是,无法保证每次调用malloc()都能分配到连续的内存块。这意味着结构不一定被连续储存。如图1,因此,与第一种方法储存一个指向300个结构块的指针相比,你需要储存300个指针,每个指针指向一个单独存储的结构。 一种解决方法是创建一个大型的指针数组,并在分配新结构时逐个给这些指针赋值,但是我们不打算使用这种方法: # define TSIZE 45 //储存片名的数组大小 # define FMAX 500 //影片的最大数量 struct film { char title [

C++函数指针详解

早过忘川 提交于 2020-02-06 07:30:36
C++指针详解请参考: C++指针详细讲解 目录 一、为何存在函数指针 二、函数地址 三、声明函数指针 四、使用指针来调用函数 五、使用typedef进行简化 附录 一、为何存在函数指针 与数据项相似的是函数也有地址,一般情况下对用户来说没什么用,但是对于程序来说,用处比较大,例如:将另一个函数的地址作为一个函数的参数,这样第一个函数就能找到第二个函数并且运行它。虽然这种方式比起直接调用的方式比更加的笨拙,但是其允许在不同的时间传递不同函数的地址,这意味着可以在不同的时间使用不同的函数。 二、函数地址 函数名就是函数的地址,例如:函数get_sum(),该函数的地址是get_sum而不是get_sum(),get_sum()为函数的返回值。 三、声明函数指针 函数指针的声明:表明指定的函数返回类型、表明函数的特征标(参数列表) 注意:只有当一个函数的返回类型和参数列表和声明的函数指针的返回类型和参数列表一致的时候才可以进行传递,编译器拒绝这种赋值。 int get_sum(int a, int b); int (*ptr)(int, int); // 声明函数指针ptr 四、使用指针来调用函数 // 第一种方式 (*ptr)(4, 5); // 第二种方式C++可用 ptr(4, 5); 五、使用typedef进行简化 例如:typedef double real;

C#指针和不安全代码

大憨熊 提交于 2020-02-06 07:23:35
C#指针和不安全代码 一、引言 C#非常擅长对开发人员隐藏大部分的基本内存管理,因为它使用了垃圾回收器和引用。但是有时我们需要对一些内存进行访问那么该怎么办?我们可以用C#中的指针。 C#中也是有指针。指针的操作效率虽然高但是不安全。因为我们可以通过地址的操作来修改内存中的一些数据,而这些内存可能被别的程序使用。这样就有可能造成一定的隐患。 例如: int i =100; int* pt=&i; //将i的地址取出赋值给pt指针。 *(pt+1)=100; //将pt指针的地址加上1后,将此地址的内容赋值为100. 问题就在第三段,因为pt原先是指向i的,i是程序申请的变量空间,所有合法,但是将pt+1的执行的内存不一定是合法的,所以赋值100有可能会出现错误。 也正是因为指针的不安全性,所以在C#中不经常用指针。而是用引用来代替指针。 C#的引用其实就是一个类型安全的指针。 既然指针不安全为什么还要使用它呢? 1、向后兼容性。 许多的外部工具或其他语言编写的Dll中很多都会用到以指针作为参数来传递。为了适应这些要求,有时不得不用到指针。 2、性能 不得不说,由于指针是直接指向内存的,所以它的效率非常的高。所以在对性能、速度要求很高的场合可以考虑用指针。当然如果有更安全的解决方法,就尽量不使用指针。 二、unsafe关键字 使用指针需要注意什么? 因为指针是不安全的

C++Primer 变量和基本类型

北城余情 提交于 2020-02-06 07:05:32
还是从最基础的来看吧,简单的大概看一下吧。 char是8位类型,最多只能包含256种字符,许多外文 字符集 所含的字符数目超过256个,char型无法表示。如中文字符,就可用 wchar_t来表示 Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。能够使计算机实现跨语言、 跨平台 的文本 转换 及处理。 void* 指针 可用于存放任意对象的地址 作用:拿它与其他类型的指针比较、作为函数的输入或输出、赋给另一个void*指针 不能直接操作void*指向的对象 指向指针的引用 引用本身不是一个对象,因此不能定义指向引用的指针,但是指针是对象,存在对指针的引用 r到底是什么? 最简单的方法是从右向左阅读r的定义。离变量最近的符号对变量的类型个有最直接的影响。 所以,在此例中,r是一个引用。r引用的是一个int指针。 const与指针中,用名词顶层const 表示指针本身是个常量,而用底层const表示指针所指的对象是一个常量。 constexpr和常量表达式 常量表达式——值不会改变并且在编译过程中就能得到计算结果的表达式。用常量表达式初始化的const对象也是常量表达式。 constexpr变量 允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化:

2.4:const限定符

独自空忆成欢 提交于 2020-02-06 05:26:41
这是个好东西,Effective C++里都已说过:能用的地方尽量用,大师都这样说了,我们这些渣渣为何不遵循? const就是常量,这就有个重要的东西了: 常量必须初始化   const int a = 0;   const int b = get_size();   //已知有get_size()函数   const int c;        //错误!!! ---------------------------------------------------------------------------------------------------------------   int m = 42;   const int n = m; --------------------------------------------------------------------------------------------------------------- 对const对象的任何修改都会导致错误。   const a = 0;   a = 1;       //错误!! ==============================分割线============================== 默认状态下,const对象仅在文件内有效 当定义一个const对象时

指针

て烟熏妆下的殇ゞ 提交于 2020-02-06 05:21:39
指针(Point) 说到指针,首先要知道什么是指针,那么什么是指针呢? 在计算机中,指针是编程语言中的一个对象,利用地址,它的值是直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。 那么什么是变量呢? 变量通俗的来说就是能变化数。从本质上说就是在内存当中某一个进程里的一个临时存储区域。其作用是用于存储一些计算当中产生的一些临时性数据。在代码中可以只使用一个变量,也可以使用多个变量,变量中可以存放单词、数值、日期以及属性。 每一个变量空间在创建的时候都会被随机的分配地址,这个地址是个真实的物理内存地址,变量空间中的数据在变化的过程中必须保持是可兼容的,至少是同一类型。否则就会存在错误。 如果直接在代码中用变量的物理地址去访问空间中的数据的话 ,就有可能访问不到。因此为了避免地址的不确定性,引入了变量名这个概念 由变量名-地址表 来保证变量名和变量之间的关系(底层实现)。这样保证其正确性。 我们说的变量空间的地址, 其实就是C语言当中学的指针。 举个例子简单的说明下: 其中*c的含义是返回c 的值作为地址的那个空间的取值。&b的意义是返回当时声明b时开辟的地址。显然可以用赋值语句对内存地址赋值。具体说明如下: #include<stdio.h> void

const指针和指向const的指针

℡╲_俬逩灬. 提交于 2020-02-06 04:56:29
int *const p=&a; 这是const指针,这种指针必须在定义时就给出它所指向的地址,否则会error:uninitialized const 'p'.const指针的指针本身是const类型,所以不能修改它所指向的地址,但可以修改它所指向的值。 const int *p; 这是指向const对象的指针,可以修改指向的地址,但不能通过这种指针来修改它所指向的值,即使它所指向的值不是const类型的。 const int *const p=&a; 这是指向const类型的const指针,没错,我们既不能修改它所指的地址,也不能修改它所指的值。 来源: https://www.cnblogs.com/zywscq/p/4271120.html

const 和指针

ε祈祈猫儿з 提交于 2020-02-06 04:56:18
c++用了那么久,觉得 const 和指针配合到一起的时候就会有点点分不出来。 如下: const Data* pData; Data const * pData Data * const pData const Data * const pData Data const * const pData    是不是有点晕? 我其实用得最多的是 const Data* pData, 也理解该语句是定义 pData指向的对象是不允许修改的(不能通过pData指针调用非const方法)。 那么Data * const pData 实际就是指针本身是不可修改的(你不能将该指针赋值成另一个地址)。 实际上只会出现3中情况. 一种修饰语义是将指针所指向的对象修饰为const. 一种修饰予以是将指针本身(值类型)修饰为const, 本质上像你定义一个 const long 一样。 最后一种是对象为const 同时指针也为const. 那么,上面那一串代码都可以对号入座。 简单的办法是: const 关键字出现在 * 前面, 修饰的是对象 const 关键字出现在 * 后面, 修饰的是指针 好了,再分析之前的例子: const Data* pData; //修饰对象 Data const * pData //修饰对象 Data * const pData //修饰指针 const Data *

指针和const

杀马特。学长 韩版系。学妹 提交于 2020-02-06 04:55:05
当使用带有const的指针时其实有两种意思。一种指的是你不能修改指针本身的内容,另一种指的是你不能修改指针指向的内容。听起来有点混淆一会放个例子上来就明白了。 先说指向const的指针,它的意思是指针指向的内容是不能被修改的。它有两种写法。 const int * p; (推荐) int const* p; 第一种可以理解为,p是一个指针,它指向的内容是const int 类型。p本身不用初始化它可以指向任何标示符,但它指向的内容是不能被改变的。 第二种很容易被理解成是p是一个指向 int 的const指针(指针本身不能被修改),但这样理解是错误的,它也是表示的是指向const的指针(指针指向的内容是不能被修改的),它跟第一种表达的是一个意思。为了避免混淆推荐大家用第一种。 再说const指针,它的意思是指针本身的值是不能被修改的。它只有一种写法 int * const p=一个地址; (因为指针本身的值是不能被修改的所以它必须被初始化) 这种形式可以被理解为,p是一个指针,这个指针是指向 int 的const指针。它指向的值是可以被改变的如*p=3; 还有一种情况是这个指针本身和它指向的内容都是不能被改变的,请往下看。 const int * const p=一个地址; int const* const p=一个地址; 看了上面的内容是不是有点晕,没关系,你不用去背它

指针和const

元气小坏坏 提交于 2020-02-06 04:54:23
将指针参数声明为指向常量数据的指针有两条理由: 这样可以避免由于无意间修改数据而导致的编译错误。 使用const使得函数能够处理const和非const实参,否则将只能接收非const数据。 如果条件允许,则应将指针形参声明为指向const的指针。 可以有两种不同的方式将const关键字用于指针: (1)让指针指向一个常量对象、这样可以防止使用该指针来修改所指向的值 int age=39; const int *pt =&age; 该声明中的const只能防止修改pt所指向的值,而不能防止修改pt指向的值。也就是说可以将一个新地址赋给pt (2)将指针本省声明为常量,这样可以防止改变指针指向的位置 int sloth=3; const int *ps=&sloth; int *const finger=&sloth; 在声明中,finger只能指向sloth,但允许使用finger来修改sloth的值。中间的声明不允许使用ps来修改sloth的值,但允许将ps指向另一个位置,简而言之,finger和*ps都是const,但*finger和ps不是。 记住:如果数据类型本身并不是指针,则可以将const数据或非const数据的地址赋给指向const的指针,但只能将非const数据的地址赋给非const的指针。 来源: https://www.cnblogs.com