指针和内存管理
爱吃的小花猫
来者皆客
展开
-
指针 (整理版)
指针是C/C++编程中的重要概念之一,也是最容易产生困惑并导致程序出错的问题之一。利用指针编程可以表示各种数据结构,通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯;指针能够灵活的操作内存,合理的操作内存能够使程序更高效。1.指针的概念 本质上讲指针也是一种变量,普通的变量包含的是实际的数据,而指针变量包含的是内存中的一块地址,这块地址指向某个变量或者函数,原创 2015-03-16 13:56:20 · 2621 阅读 · 0 评论 -
Windows的内存管理
1.基本概念:物理内存、虚拟内存;物理地址、虚拟地址、逻辑地址;页目录,页表 2.Windows内存管理 3.CPU段式内存管理 4.CPU页式内存管理 一、基本概念1. 两个内存概念物理内存:人尽皆知,就是插在主板上的内存条。他是固定的,内存条的容量多大,物理内存就有多大(集成显卡系统除外)。但是如果程序运行很多或者程序本身很大的话,就会导致大量的物原创 2015-03-12 17:03:33 · 9798 阅读 · 2 评论 -
heap和stack有什么区别
1.heap是堆,stack是栈。2.stack的空间由操作系统自动分配和释放,heap的空间是手动申请和释放的,程序的运行场所是内存,栈和堆是进程的虚拟内存中的两部分区域。当程序被执行时,程序代码,你所创建的变量、常量等都会被压入栈空间里,栈是程序代码的执行区域。栈的内存地址是连续的且被一一记录,所以说当你创建了一个变量(比如int var = 1),我们就可以通过var这个变量原创 2015-03-12 11:47:34 · 65417 阅读 · 0 评论 -
Mac的内存管理
Mac下的资源管理和Windows的资源管理是完全不同的两种概念,Windows认为一个程序占用太多的资源纯属浪费,而Mac认为,资源放在那里白白不用才是浪费。 所以在Windows下,当一个程序退出时,它所占用的内存会被立即释放,留给后来的程序使用,也就是说你走了你的位置马上会被取代,即便你刚出去再回来也会发现你得重新找位置;而Mac不同,在Mac下当一个程序退出时,系统并不会立刻释放程序原创 2015-03-12 16:42:13 · 51917 阅读 · 5 评论 -
Linux内存管理
在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然。这是Linux内存管理的一个优秀特性,在这方面,区别于Windows的内存管理。主要特点是,无论物理内存有多大,Linux 都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能。而Windows是只在需要内存时,才为应用程序分配内存,并不能充分原创 2015-03-12 16:55:39 · 41172 阅读 · 0 评论 -
内存管理
内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C原创 2015-03-12 17:09:40 · 84321 阅读 · 7 评论 -
Pointers to classes (From the note of my firend)
Pointers to classesObjects can also be pointed to by pointers: Once declared, a class becomes a valid type, so it can be used as the type pointed to by a pointer. For example:原创 2015-03-18 01:49:25 · 1080 阅读 · 1 评论 -
Stack的三种含义
学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈"。理解这个概念,对于理解程序的运行至关重要。容易混淆的是,这个词其实有三种含义,适用于不同的场合,必须加以区分。含义一:数据结构stack的第一种含义是一组数据的存放方式,特点为LIFO,即后进先出(Last in, first out)。在这种数据结构中,数据像积木那样一层层堆起来,后面加入原创 2015-03-12 13:15:20 · 32200 阅读 · 3 评论 -
第四章 指针 Pointer(入门)
第三章指针 Pointer 我第一次上网求助,就是在pointer方面遇到了问题,对于我本人来说,有些时候reference和de-reference,address、location、value经常会弄混的,就连我的教授都自己坦言,不仅C++的初学者都会在pointer方面遇到这样那样的问题,而且一些从业多年的编程大神也会遇到指针上面的问题。 有一个笑话,当你学会了指针才能懂原创 2015-03-09 15:28:34 · 18936 阅读 · 0 评论 -
Answer's Question about pointer
When you create a new pointer, this will be in heap until you delete it. So what you said is sort of mistake, "函数内部有个局部变量指针", then the pointer should not exist after the function return.Therefor原创 2015-03-14 01:16:23 · 617 阅读 · 0 评论 -
各种数据结构与算法知识入门经典(不断更新)
自荐者和推荐者请留言基本算法贪心算法:贪心算法 作者:独酌逸醉 贪心算法精讲 作者:3522021224递归和分治:递归与分治策略 作者:zhoudaxia图论图的遍历(DFS和BFS): 图的遍历 作者:jefferent最小生成树(Prim算法和Kruskal算法): 贪心算法--最小生成树 作者:独酌逸醉Dij原创 2015-03-11 16:06:48 · 1656 阅读 · 0 评论 -
Creating objects on stack or heap
class Player { private:int health; int strength; int agility;public:void move();void attackEnemy(); void getTreasure();};int main(){Player p1;Player *p2 = new Playe原创 2015-03-18 06:33:40 · 999 阅读 · 1 评论 -
char *s="string"和char s[]="string"的区别
char *s="string"的内容是不可以改的void main(){ char* pStr1 = "Hello!"; char pStr2[] = "Hello!"; change(pStr1); change(pStr2);}void change(char* pInstr){ pInstr[0]='O';}原创 2015-04-04 14:35:39 · 2656 阅读 · 0 评论 -
C语言排序算法总结
功能:选择排序输入:数组名称(也就是数组首地址)、数组中元素个数算法思想简单描述: 在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。选择排序是不稳定的。算法复杂度O(n2)--[n的平方]==========================================转载 2015-04-05 02:31:18 · 1683 阅读 · 0 评论 -
C++指针详解
指针的概念指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。 先声明几个指针放着做例子: 例一: int *ptr; char *ptr; int **ptr; int (*pt原创 2015-03-10 15:43:14 · 2313 阅读 · 0 评论 -
Fun with pointer!
int x=1; //x的地址为50语句p*pxint x=1; const int *p =&x;50 可以修改 int y=2;p=&y,此时p和*p都变1 不能修改可以改变。x=2,此时*p=2,但p不变const int x=1;const int *p=&x;50 不可修改1 不可修改不可修改con原创 2015-03-10 16:32:48 · 1235 阅读 · 0 评论 -
void 指针的转换
任何类型的指针都可以显式转换为void类型,且不会丢失数据。如以下程序:#includeint main(void){short a=5;void *p1;short *p2;p1=(void *)&a;p2=(short *)p1;printf(“%d\n”,*p2);return 0;} a的地址为0x0012ff7c,因此原创 2015-03-17 15:29:00 · 5856 阅读 · 2 评论 -
void指针 (补充)
void* 表示空指针。空指针不能直接使用,例如,指针的加减法操作(因为不知道类型,无法确定偏移的大小)。某些情况下,不知道指针的类型,先用void*来代替,根据需要再强制转换成需要的指针类型使用。比如malloc函数,它只是申请了一块堆内存,并将首地址返回,但是它根本就不知道调用者会用什么指针来接收这个地址,所以干脆就返回一个指向内存地址的空指针,由用户自己来转换。原创 2015-03-17 14:32:44 · 844 阅读 · 0 评论 -
void指针的转换(2)
void类型指针可以通过显式转换为具有更小或相同存储对齐限制的指针,但数据可能失真。所谓“相同存储对齐限制”是指void类型指针所指的数据在内存中所占的长度与显式转换后的指针所指的数据在内存中所占的长度相等,比如以上程序中的p1所指的原数据在内存中占2个字节,p2所指的数据在内存中也是占两个数据。但应注意的是,只有上面的这种转换前后指针所指数据类型一致的转换才保持数据不失真,如果类型不一致,即使具原创 2015-03-17 15:35:21 · 2135 阅读 · 0 评论 -
void及void指针含义的深刻解析
void的含义void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。void指针使用规范①void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值。例如:int * pint;void *pvoid;pvoid = pint; /* 不过不能 pint= pvoid; */如果要将pvoid赋给其他类型指针,则需要强转载 2015-03-17 12:33:51 · 3969 阅读 · 1 评论 -
指针类型强制转换
问题为下:#includevoid main(){ int k=1; int *f=&k; *(float*)(f)=1; cout}//输出为啥不是1呢这个时候,我们可以看到函数式里面有格式的转换,如果格式转换时存在除void格式外,还有两个及两个以上的格式的转换,则这时候的指针所指的variable所占的内存会产生变化,从而会使格式发生相应的变化原创 2015-03-17 15:51:58 · 1540 阅读 · 1 评论 -
const void *a 与 void *const a 的区别
const void *a这是定义了一个指针a,a可以指向任意类型的值,但它指向的值必须是常量。在这种情况下,我们不能修改被指向的对象,但可以使指针指向其他对象。例如:const void *a;*a=0x123;//是编译通不过的,因为*a中放的是个const值。const值是不能被改变的。const int m=1; const int n=2原创 2015-03-17 15:55:15 · 880 阅读 · 0 评论 -
void型指针
void型指针,表示这个指针指向的内存中的数据的类型要由用户来指定。比如内存分配函数malloc函数返回的指针就是void *型,用户在使用这个指针的时候,要进行强制类型转换,也就是显式说明该指针指向的内存中是存放的什么类型的数据(int *)malloc(1024)表示强制规定malloc返回的void*指针指向的内存中存放的是一个个的int型数据。原创 2015-03-17 13:08:13 · 1112 阅读 · 2 评论 -
int**a = new int[5][6] 怎么delete
int **a = new int[5][6],这个根本编译不过去吧。如果你想new一个二维数组出来,应该这样:int** a= new int*[5];for (int i = 0; i { a[i] = new int[6];}delete的时候,反过来就行了:for (int i = 0; i { delete[]原创 2015-03-29 12:50:53 · 1261 阅读 · 1 评论 -
C++ 指针详解(2)
一、指针运算符*和 &地址运算符eg: y=&x; z = *y; x 的值为1000,x 的地址为551.&地址运算符是一元运算符,反回它的操作数的内存地址.y 将接收到地址55.2.*指针运算符是一元运算符,它是&运算符的相反形式,*运算符能反回位于其操作数所指定的地址的变量的值.即只要*后面是地址(任何形式),*都返回地址对应的值。原创 2015-03-10 15:58:13 · 1745 阅读 · 0 评论 -
第四章 指针 Pointer(高级)
第四章 指针 pointer(高级)希望初学者在入门的时候,可以看一些英文的原著,我感觉英文书籍是原意,而一些现在中文的翻译是加上了译者的一些理解,多少是拿来的东西,所以一些东西我希望能够按照自己的来。 &A 就是取存放A的位置,我们可以将这个位置复制给pointer variable。*A 从A所指的位置中“提取数值” 接上回,首先取个例子:Algor原创 2015-03-10 14:33:11 · 810 阅读 · 0 评论 -
C++中指针和引用的区别
★相同点:●都是地址的概念;//作用于地址指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。★不同点:●指针是一个实体,而引用仅是个别名;●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;●引用没有const,指针有const,const的指针不可变;●引用不能为空,指针可以为空原创 2015-03-10 16:51:01 · 64301 阅读 · 0 评论 -
谈谈如何研究指针 怎么克服指针带来的困难
刚刚写完指针的博客,总是感觉没有完全把我的所有想法讲给大家。第一,C++的指针对于所有编程人员都是难点,不会或是经常出错是正常的,你的老师也会经常出错。第二,指针是C++特别的,也是最重要的,如果要学习C++就必须要学指针,如果学C++而不学指针的话,就像学油画不知道色彩一样。第三,指针可能是所有C++实际编程中最常出现的问题,到时候,你就知道什么就“内原创 2015-03-10 14:54:11 · 1201 阅读 · 0 评论 -
第四章 指针 Pointer(进阶)
第四章 指针 pointer(进阶)那么我们这次的课程就是学习如何的实现pointer怎么使用pointer。我们已经知道在pseudo-code如何的declare一个pointer。 Integer myNumrefToInteger myNumPtr In C++int myNum;int *myNumPtr; Suppose X is a原创 2015-03-09 15:47:01 · 1895 阅读 · 0 评论 -
C/C++ STACK &HEAP 区别
堆:顺序随意 栈:先进后出 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式原创 2015-03-12 11:51:39 · 76330 阅读 · 10 评论