指针

地址、指针与引用

假如想象 提交于 2020-01-05 10:30:54
计算机本身是不认识程序中给的变量名,不管我们以何种方式给变量命名,最终都会转化为相应的地址,编译器会生成一些符号常量并且与对应的地址相关联,以达到访问变量的目的。   变量是在内存中用来存储数据以供程序使用,变量主要有两个部分构成:变量名、变量类型,其中变量名对应了一块具体的内存地址,而变量类型则表明该如何翻译内存中存储的二级制数。我们知道不同的类型翻译为二进制的值不同,比如整型是直接通过数学转化、浮点数是采用IEEE的方法、字符则根据ASCII码转化,同样变量类型决定了变量所占的内存大小,以及如何在二进制和变量所表达的真正意义之间转化。而指针变量也是一个变量,在内存中也占空间,不过比较特殊的是它存储的是其他变量的地址。在32位的机器中,每个进程能访问4GB的内存地址空间,所以程序中的地址采用32位二进制数表示,也就是一个整型变量的长度,地址值一般没有负数所以准确的说指针变量的类型应该是unsigned int 即每个指针变量占4个字节。还记得在定义结构体中可以使用该结构体的指针作为成员,但是不能使用该结构的实例作为成员吗?这是因为编译器需要根据各个成员变量的大小分配相关的内存,用该结构体的实例作为成员时,该结构体根本没有定义完整,编译器是不会知道该如何分配内存的,而任何类型的指针都只占4个字节,编译器自然知道如何分配内存。我们在书写指针变量时给定的类型是它所指向的变量的类型

C语言 指针

泄露秘密 提交于 2020-01-05 10:30:34
指针 : 地址 的代名词 , 在32位系统中,指针就4个字节; 指针变量 : 存放指针这个概念的盒子 指针每次读取的数据大小,取决于定义指针的数据类型;(int *p ; char *p) #include "stdio.h" int a=0x213432; int *p1; void main() { p1=&a; printf("%x\n",*p1); }结果:213432 int a=0x213432; char *p1; void main() { p1=&a; printf("%x\n",*p1); }编译会出现警告warning: assignment from incompatible pointer type, 结果为32.    指针+修饰符 const 常量,只读【不能变】 char *p; const char *p; p可以指向任意空间,但不希望改变其中的内容(与char const *p相同 ) char * const p : p一旦被赋值,将永远指向这个地址,但内容可以改变(与 char *p const相同 ) 硬件资源 const char * const p : ROM volatile 防止优化指向内存地址 volatile char *p typedef 别名 指针+运算符 加减运算 指针的加法/减法运算,实际上是增加一个单位

野指针?空指针?

浪子不回头ぞ 提交于 2020-01-05 04:44:56
野 指针指的是指向不可用内存的指针。任何指针变量在被创建时,不会自动成为NULL指针(空指针),其缺省值是随机的,所以,指针变量在创建的同时应当被初始化,或者将指针设置为NULL,或者让它指向合法的内存,而不应该放之不理,否则就会成为野指针 。 而同时由于指针被释放(free或delete)后,未能将其设置为为NULL,也会导致该指针变为野指针。虽然free和delete把指针所指的内存给释放掉了,但它们并没有把指针本身干掉 ,一般可以采用语句if (p != NULL)进行防错处理,但是if语句却起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。第三种造成野指针的原因是指针操作超越了变量的作用范围。 例如如下程序示例。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *p = (char *) malloc(100); strcpy(p, "hello"); free(p); if(p != NULL) printf("Not NULL\n"); return 0; } 输出: Not Null 上例中,虽然对p执行了free操作 , p 所指的内存被释放掉了,但是p所指的地址仍然不变,在后续的判断p是否为NULL时,根本没有起到防错的作用

C语言-----野指针

ε祈祈猫儿з 提交于 2020-01-05 04:39:28
问题所在 1、 局部指针变量没有被初始化 2、 使用已经释放过后的指针 3、 指针所指向的变量在指针之前被销毁 4、 结构体成员指针未初始化, 没有为结构体指针分配足够的内存 ,内存越界(考虑使用柔性数组)和 泄露 避免规则 1、用 malloc 申请了内存之后,应该立即检查指针值是否为 NULL ,防止使用值为 NULL 的指针 2、牢记数组的长度,防止数组越界操作,考虑使用柔性数组 3、动态申请操作必须和释放操作匹配,防止内存泄露和多次释放 4、 free 指针之后必须立即赋值为 NULL malloc用于从堆中分配一块指定大小的内存,以void *的类型返回这块内存的起始地址。malloc的参数就是要分配的内存的大小,以字节为单位。 所以如果要分配1个整型空间就需要malloc(sizeof(int)),由于返回的void *不能直接赋值给int *,所以还要进行一次强制类型转换int * s=(int*)malloc(sizeof(int)); struct Student { char* name; int number; }; int main() { struct Student s; strcpy(s.name, "gggg"); // OOPS! ////////////////////////////////////野指针,,不能随便赋值,因为s是一个局部变量

C语言野指针

坚强是说给别人听的谎言 提交于 2020-01-05 04:37:06
指针是C语言一个很强大的功能。然而所谓成也萧何,败也萧何,用好了指针会使程序大放异彩,用错了指针轻者只是报个错,重者可能整个系统都崩溃了。本篇我们来谈谈指针一种错误的使用方法”野指针“。 野指针一般是指定义时没有给初值的指针变量。来看以下程序: #include <stdio.h> #include <string.h> int main() { char *source1 = "abc"; char *source2; printf("source2的值是:%u\n", source2); strcpy(source2 , source1); printf("%s",source2); return 0; } 这段程序定义了一个指向字符的指针 source2,但是没有给它一个初始值。下面的代码就是将字符串”abc“复制到source2中,编译的结果如下: --------------------Configuration: Test - Win32 Debug-------------------- Compiling... demo.c D:\CCode\Test\demo.c(8) : warning C4700: local variable 'source2' used without having been initialized Linking... Test.exe

成员指针

爱⌒轻易说出口 提交于 2020-01-05 04:26:17
C++中,成员指针是最为复杂的语法结构。但在事件驱动和多线程应用中被广泛用于调用回叫函数。在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中,如果不用成员指针,编程是非常困难的。   刚遇到这种语法时也许会让你止步不前。但你会发现,使用恰当的类型定义之后,复杂的语法是可以简化的。本文引导你了解成员函数指针的声明,赋值和调用回叫函数。    成员函数指针的声明   一个成员函数指针包括成员函数的返回类型,后随::操作符类名,指针名和函数的参数。初看上去,语法有点复杂。其实可以把它理解为一个指向原函数的指针,格式是:函数返回类型,类名,::操作符,指针星号,指针名,函数参数。   一个指向外部函数的指针声明为:   void (*pf)(char *, const char *);   void strcpy(char * dest, const char * source);   pf=strcpy;   一个指向类A成员函数的指针声明为:   void (A::*pmf)(char *, const char *);   声明的解释是:pmf是一个指向A成员函数的指针,返回无类型值,函数带有二个参数,参数的类型分别是char * 和 const char *。除了在星号前增加A:: ,与声明外部函数指针的方法一样。    赋值  

一般函数指针和类的成员函数指针

↘锁芯ラ 提交于 2020-01-05 04:25:47
转载请注明原文网址: http://www.cnblogs.com/xianyunhe/archive/2011/11/26/2264709.html 函数指针是通过指向函数的指针间接调用函数。函数指针可以实现对参数类型、参数顺序、返回值都相同的函数进行封装,是多态的一种实现方式。由于类的非静态成员函数中有一个隐形的this指针,因此,类的成员函数的指针和一般函数的指针的表现形式不一样。 1、指向一般函数的指针 函数指针的声明中就包括了函数的参数类型、顺序和返回值,只能把相匹配的函数地址赋值给函数指针。为了封装同类型的函数,可以把函数指针作为通用接口函数的参数,并通过函数指针来间接调用所封装的函数。 下面是一个指向函数的指针使用的例子。 #include <iostream.h>/*指向函数的指针*/typedef int (*pFun)(int, int);int Max(int a, int b){ return a > b ? a : b;}int Min(int a, int b){ return a < b ? a : b;}/*通用接口函数,实现对其他函数的封装*/int Result(pFun fun, int a, int b){ return (*fun)(a, b);}void main(){ int a = 3; int b = 4; cout<<"Test

C++对象指针—指向对象成员的指针

心已入冬 提交于 2020-01-05 04:25:06
对象有地址,存放对象初始地址的指针变量就是指向对象的指针变量。对象中的成员也有地址,存放对象成员地址的指针变量就是指向对象成员的指针变量。 1、指向对象数据成员的指针定义指向对象数据成员的指针变量的方法和定义指向普通变量的指针变量方法相同。 例如 int *p1; //定义指向整型数据的指针变量 定义指向对象数据成员的指针变量的一般形式为数据类型名 *指针变量名;如果Time类的数据成员hour为公用的整型数据,则可以在类外通过指向对象数据成员的指针变量访问对象数据成员hour。 p1=&t1.hour;//将对象t1的数据成员hour的地址赋给p1,p1指向t1.hour cout<<*p1<<endl;//输出t1.hour的值 2、指向对象成员函数的指针需要提醒读者注意: 定义指向对象成员函数的指针变量的方法和定义指向普通函数的指针变量方法有所不同。 成员函数与普通函数有一个最根本的区别: 它是类中的一个成员。编译系统要求在上面的赋值语句中,指针变量的类型必须与赋值号右侧函数的类型相匹配,要求在以下3方面都要匹配: ①函数参数的类型和参数个数; ②函数返回值的类型; ③所属的类。 定义指向成员函数的指针变量应该采用下面的形式: void (Time::*p2)( );//定义p2为指向Time类中公用成员函数的指针变量 定义指向公用成员函数的指针变量的一般形式为 数据类型名

C++ 基础知识复习(二)

▼魔方 西西 提交于 2020-01-05 04:24:21
异常处理部分: 23. 在c++的异常处理中,除了提供异常的关键字语法支持以外,其标准库中支持异常处理而封装异常类也很好的为应用程序中异常处理判断使用提供直接的帮助。C++语言中针对异常处理提供了三个关键字,分别为try、throw与catch。C++应用程序中通过这三个关键字实现机制组合来实现异常的处理。try体中可以直接抛出异常,或者在try体中调用的函数体中间接的抛出。注意catch是接thorw出来的数据的,数据类型上要兼容。 预处理及内存管理部分: 24. C语言提供的预处理功能有哪些: 答:宏定义,文件包含和条件编译。 25. include的使用方式: 答:include 如果包含的文件名在尖括号内,则为标准头文件,会在预定义的位置集进行查找。位置集可有环境变量或命令行修改。引号中为自定义头文件,查找始于源文件所在路径,一层层找直到系统文件目录。 26. 如何申请以及释放空间: 答:int *p; p=new int; *p=100; delete p; 注意如果要对这一内存地址进行操作,需要使用*号。 27. 什么是虚函数和纯虚函数: 答:虚函数用来建立抽象模型,从而达到方便系统扩展的目的,纯虚函数是指标明不具体实现的虚函数,是一种特别的虚函数。虚函数必须是基类定义的非静态函数,可以是protected活着public的。在一个类中,虚函数后面加上=0

c++复习笔记(3)

前提是你 提交于 2020-01-05 04:23:35
这篇是各种琐碎的东西。 类的函数如果在类内部直接实现,则成为内联函数候选。类外部实现的方法,可以用inline声明,使其称为内联函数候选。但是函数是否可以成为内联函数,需要看编译器的行为。、 构造函数可以使用初始列: functionName (varList) : var1(value1), var2(value2) {} 构造函数可以放在private区(单例)。 类的成员函数可以分为改变类的值的和不改变类的值的。不改变类的值的函数可以加const: returnType functionName (varList) const {} 这里注意,这么写的原因,有一个是:当我们声明了一个const的实例,然后调用不是const的方法就会出错。所以对不改变值的函数,加上const,就可以被const实例正常调用。 函数的参数传递和返回值,首先考虑引用。若参数不需要变化时,要传const引用。 标记friend的方法可以访问class的private部分,注意友元函数并不是类的一部分,仅仅是需要在类中进行声明。相同class的objects互为friends。 对于返回值,如果返回的是传入的指针或引用,则可以返回引用。如果返回的是函数内新建的变量,就不能返回引用(因为函数结束之后,新建的变量的生命周期就结束了,此时返回引用就会发生错误)。 所有的成员函数都默认有一个参数this