指针变量

理清C++常量指针和指针常量这团乱麻

风流意气都作罢 提交于 2019-12-26 12:08:53
写在前面: 与其说C++中的常量指针和指针常量是一块很有嚼头的语法糖,不如说它是一块相当难啃的骨头。其实本来没什么,这无非是 const int *p与 int* const p 的区别, 但一涉及到起名字,特别是给他们戴上“常量指针”和“指针常量”的中文帽子,由于作者和译者(针对外文书)的不同,就出现了“张冠李戴”和“李冠张戴”的乱像,不知道谁是谁了,弄得人一头雾水,尤其是对于初学者。 本文的目的就是针对这一细节,为大家将两者理清楚,同时说明在使用上的区别。 注意: 1.const int *p也可写成int const *p,即 C++中const int和int const无区别,这使得本来就很乱的局面更加麻烦,本文中我只使用const int,以后不再说明。 2. 如果您讨厌啰嗦,只想学“干货”,您可以直接跳到“ 安能辨我是雄雌——判断方法”一节(在下技术有限,就不设置页面内跳转了)。 在理清楚之前,让 我们先简单看看当前“乱象丛生”的现状吧。 一、const遇上指针——一团乱麻 同样的问题,相反的解释 1.标新立异的少数派 C++ Primer第五版的提法可谓与其它C++书籍背道而驰,它的提 常量指针——int* const p 指向常量的指针——const int *p 在英文版中,int* const p被称为const pointer,于是中文版将其译为常量指针

动态内存分配(new)和释放(delete)

北城余情 提交于 2019-12-26 11:01:30
在之前我们所写过的程序中,所必需的内存空间的大小都是在程序执行之前就已经确定了。但如果我们需要内存大小为一个变量,其数值只有在程序运行时 (runtime)才能确定,例如有些情况下我们需要根据用户输入来决定必需的内存空间,那么该怎么办呢? 答案是 动态内存分配 (dynamic memory),为此C++ 集成了操作符 new 和 delete 。 1. new 和 new [] 操作符 动态内存分配用操作符 new 。new 后面跟一个数据类型,如果要求的元素多于一个,需要加上 [], 元素数量放在 [] 中。它返回一个指向内存块开始位置的指针。语法是: pointer = new type pointer = new type [number_of_elements] 第一个表达式为数据类型为 ‘type’ 的 一个 元素分配内存地址。第二个表达式为数据类型为 ‘type’ 的 一组 元素分配一块内存,其中 number_of_elements 是整数型,表示元素的个数。例如: int* foo; foo = new int[5]; 在这个例子里,操作系统分配了可存储5个整型int元素的内存空间,返回指向这块空间开始位置的指针并将它赋给foo。因此,现在foo 指向一块可存储5个整型元素的合法的内存空间,如下图所示。 这里,foo 是一个指针,foo指向的第一个元素可以通过语句

Java集合---LinkedList源码解析

﹥>﹥吖頭↗ 提交于 2019-12-26 02:32:36
Java集合---LinkedList源码解析 一、源码解析 1、 LinkedList类定义 2、LinkedList数据结构原理 3、私有属性 4、构造方法 5、元素添加add()及原理 6、删除数据remove() 7、数据获取get() 8、数据复制clone()与toArray() 9、遍历数据:Iterator() 二、ListItr 一、源码解析 1、 LinkedList类定义。 public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。 LinkedList 实现 List 接口,能对它进行队列操作。 LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。 LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。 LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。 LinkedList 是非同步的。

加密解密帮助类

故事扮演 提交于 2019-12-26 01:48:50
二进制数据的序列化反序列化和Json的序列化反序列化的重要区别   前言:最近一个一个很奇怪的问题,很明白的说,就是没看懂,参照下面的代码: /// <summary> /// 反序列化对象 /// </summary> /// <typeparam name="T">指定对象类型</typeparam> /// <param name="data">字节数组</param> /// <param name="isClearData">压缩完成后,是否清除待压缩字节数组里面的内容</param> /// <returns>指定类型的对象</returns> public static T DeserializeByBytes<T>(byte[] data, bool isClearData = true) { T t = default(T); if (data == null) return t; try { BinaryFormatter formatter = new BinaryFormatter(); using (MemoryStream ms = new MemoryStream(data)) { t = (T)formatter.Deserialize(ms); } formatter = null; if (isClearData) Array.Clear

指针的本质:表示内存地址的数据类型

假装没事ソ 提交于 2019-12-25 21:32:13
更多来自: http://imcc.blogbus.com 3.9.1 指针的本质:表示内存地址的数据类型 在典型的32位平台上,可以把内存空间看成是由很多个连续的小房间构成的,每个房间就是一个小存储单元,大小是1个字节,房间中住着数据。有的数据比较小,比如一个char类型的字符,它只需要一个房间就够了。而有的数据比较大,就需要占用好几个房间,比如一个int类型的整数,其大小是4个字节,需要4个房间才可以安置。为了方便找到住在这些房间中的数据,房间就需要按照一定的规则编号,这个编号,就是通常所说的内存地址。这些编号是用一个32位的二进制数来编码的,比如0x7AE4074B、0xFFFFFFFF等,如图3-6所示。一旦知道某个数据的房间编号,就可以通过这个编号来对相应房间中的数据进行存取操作。C++中为了灵活地操作内存,特别内建了一种特殊的数据类型,以用来存放内存单元的地址,这就是指针。而存放在指针中的内存地址,则可能是一个对象的地址、一个整数的地址,甚至是一个函数的地址。一般来说,如果指针变量所保存的是一个对象或者函数的地址,就说这个指针指向这个对象或者函数。 图3-6 内存被划分为许多小的单元房间 来源: https://www.cnblogs.com/chenliangqiao/archive/2011/07/15/2107100.html

void,extern,sizeof

左心房为你撑大大i 提交于 2019-12-25 18:33:37
高手潜规则:禁用 goto 程序质量与 goto 出现次数成反比 void 指针的意义 1.C 语言规定只有相同类型的指针才可以相互赋值 2.void* 指针作为坐值用于“接收”任意类型的指针 3.void* 指针作为右值赋给其它指针时需要强制转换类型。 int *pI = (int*)malloc(sizeof(int)); extern 的意义 1. 用于声明外部定义的变量和函数 2. 用于 “告诉”编译器用 C 方式编译 C++ 编译器和一些变种 C 编译器默认会按自己的方式编译函数和变量,所以有事需要 extern 关键字。 extrn “C” { int f(int a,int b) { return a+b; } } sizeof 是编译器内置指示符,不是函数。 用法: 用了统一, sizeof(int) ,不推荐用空格。 来源: https://www.cnblogs.com/stm32f4/p/6264765.html

指针二三事

痴心易碎 提交于 2019-12-25 13:43:21
C 语言中最棘手问题的当属指针了,不过这也是 C 的精华所在。 指针也是一种变量,区别在于他的值是一个内存地址。 32 位机器上,指针变量占用四个字节。往往你觉得你把指针弄的很透彻了,但你还是会做错题目,或许因为粗心,或许自己混淆了,总之指针问题真的很绕。最近笔者在看「程序员求职成功之路」,书中伊始讲的就是 C 语言指针,看完之后获益匪浅,特在此总结一下。 1. 先看一道经典的指针题目: #include <stdio.h> int main() { int a[5][10]; printf("%d,%d,%d\n",a,a+1,&a+1); return 0; }    输出结果为如下,试分析其原因 原因分析: a 和 &a 都是数组 a[5][10] 的首地址。但是他们的类型却不相同, a 是 int a [10] 的类型,而 &a 是 a [5][10] 的类型。指针运算中加减 1 代表的加减了指针类型的长度。故: a+1=2293360+4*10=2293400 &a +1= 2293360 +4*10*5=2293560 更抽象的说,例如数组 int a [M1][M2][.....][M n ] a+1= 首地址 +M2*M3* ......*Mn*sizeof(int) &a+1= 首地址 +M1*M2* M3*......* Mn *sizeof(int) 2.

指针二三事

瘦欲@ 提交于 2019-12-25 13:43:07
C 语言中最棘手问题的当属指针了,不过这也是 C 的精华所在。 指针是一种 数据类型 ,区别在于指针类型的值是一个内存地址。 32 位机器上,指针变量占用四个字节。往往你觉得你把指针弄的很透彻了,但你还是会做错题目,或许因为粗心,或许自己混淆了,总之指针问题真的很绕。最近笔者在看「程序员求职成功之路」,书中伊始讲的就是 C 语言指针,看完之后获益匪浅,特在此总结一下。 1. 先看一道经典的指针题目: #include <stdio.h> int main() { int a[5][10]; printf("%u,%u,%u\n",a,a+1,&a+1); return 0; }    输出结果为如下,试分析其原因 原因分析: a 和 &a 都是数组 a[5][10] 的首地址。但是他们的类型却不相同, a 是 int a [10] 的类型,而 &a 是 a [5][10] 的类型。指针运算中加减 1 代表的加减了指针类型的长度。故: a+1=2293360+4*10=2293400 &a +1= 2293360 +4*10*5=2293560 更抽象的说,例如数组 int a [M1][M2][.....][M n ] a+1= 首地址 +M2*M3* ......*Mn*sizeof(int) &a+1= 首地址 +M1*M2* M3*......* Mn *sizeof(int

C语言博客作业05--指针

女生的网名这么多〃 提交于 2019-12-25 03:26:39
1.本章学习总结 1.1 思维导图 1.2 本章学习体会及代码量学习体会 1.2.1 学习体会 可能因为这两周进度的加快,感到比较吃力,知识点比较抽象,不那么容易理解,也可能最近因为被准备考试,写论文等事情追赶着,对C语言、PTA这方面有所懈怠(我的错。。。T_T)。总之,在指针方面还存在很多不足,有的知识点没有及时掌握,还要课后花时间看课本,对一些用法或者需要注意的地方还不够熟悉,希望通过之后的时间可以抓紧时间,掌握不熟练或者遗漏的知识点,多加练习,掌握这方面的知识。 1.2.2 代码累计 2.PTA总分 2.1截图PTA中指针题目集的排名得分 2.2 我的总分: 125分 3.PTA实验作业 3.1 PTA题目 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。 3.1.1 算法分析 定义 i,统计count=0; 定义 字符数组s[500001],指针*p; gets(s); //输入英语 i=strlen(s)-1;//取字符串长度 for i=strlen(s)-1 to 0 do if s[i]==' ' then if s[i+1]!=' '&&s[i+1]!='\0' //出现单词 p=s+i+1; count++; if count>1 then printf(" ");//控制输出最后一个单词没有空格 printf("%s",p); end if s

C程序的内存分配及动态内存

走远了吗. 提交于 2019-12-25 02:56:02
1、程序内存的分配 一个由C/C++编译的程序占用的内存分为以下几个部分: 1)栈区(stack) — 由编译器自动分配释放 , 存放为运行函数而分配的局 部变量、 函数参数、 返回数据、 返回地址等。 其操作方式类似于数据结构中的 栈。 2)堆区(heap) — 一般由程序员分配释放, 若程序员不释放, 程序结束 时可能由OS回收,否则程序就会存在内存泄漏的问题 。 分配方式类似于链表。 3)全局区(静态区) (static) —存放全局变量、 静态数据、 常量。 程序结 束后由系统释放。 4)文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放。 5) 程序代码区—存放函数体(类成员函数和全局函数) 的二进制代码 内存分配方式有三种: 1)从静态存储区域分配: 内存在程序编译的时候就已经分配好, 这块内存在程序的整个运行期 间都存在。 例如全局变量, static 变量。 2)在栈上创建: 在执行函数时, 函数内局部变量的存储单元都可以在栈上创建, 函数 执行结束时这些存储单元自动被释放。 栈内存分配运算内置于处理器 的指令集中, 效率很高, 但是分配的内存容量有限。 3)从堆上分配: 亦称动态内存分配。 程序在运行的时候用 malloc 或 new 申请任意多少的内存, 程序员自己负责在何时用 free 或 delete 释放内存。 动态内存的生存期由程序员决定,