指针

函数指针和指针函数的区别

我与影子孤独终老i 提交于 2020-03-04 06:14:08
一、【 函数指针 】 在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用 指针变量 指向数组的首地址,也可以使用 指针变量 指向函数代码的首地址,指向函数代码首地址的 指针变量 称为 函数指针 。 1、函数指针定义 函数类型(*指针变量名)(形参列表); “函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。 例如: int (*f)(int x); double (*ptr)(double x); 在定义函数指针时请注意: 函数指针和它指向的函数的参数个数和类型都应该是—致的 ; 函数指针的类型和函数的返回值类型也必须是一致的。 2、函数指针的赋值 int func(int x); /* 声明一个函数 */ int (*f) (int x); /* 声明一个函数指针 */ f=func; /* 将func函数的首地址赋给指针f */ 赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。 二、【 指针函数 】 一个函数不仅可以带回一个 整型数据 的值,字符类型值和实型类型的值,还可以带回指针类型的数据,使其指向某个地址单元。 返回指针的函数,一般定义格式为:

C++:常对象成员和常成员函数

人盡茶涼 提交于 2020-03-04 05:25:04
5-1 常对象成员和常成员函数 例子: 常对象成员: 常成员函数: 上图:常成员函数中为什么不能改变数据成员的值? 上图:编译后this指针是用const指针修饰的,成了一个常指针,通过常指针改变指针指向的数据是不被允许的; 上图中:互为重载,但不推荐这样使用; 上图:调用的是不带const的函数; 5-2 常对象成员和常成员函数实践 Coordinate.h # include <iostream> using namespace std ; class Coordiante { public : Coordiante ( int x , int y ) ; ~ Coordiante ( ) ; void setX ( int _x ) ; //第一个参数(this指针)不加也行(默认的),之所以报错的原因是m_coora只读,而this指针可读可写 void setY ( int _y ) ; int getX ( ) const ; //m_coora只读,而this指针可读可写,所以加const修饰就只读了 int getY ( ) const ; //const修饰之后成为常成员函数;set函数不能加const private : int m_iX ; //只有类里的成员函数才能访问private的成员? int m_iY ; } ; Coordinate.cpp #

虚函数和模板的用途区别

半腔热情 提交于 2020-03-04 02:49:49
模板是范型编程的基础,所谓范型编程就是用独立与任何特定类型的方式编写代码 所以简单地说,类是对象的抽象,而模板又是类的抽象,也就用模板能定义出具体类 再理解深刻点 在c++里,常说的多态一般分为两种: 一种是运行时的多态,也就是虚函数体现的多态 另一种是编译时的多态,也就是范型编程的多态,体现在参数的多态 在作用上是为了提高编程效率,其实用其他技术也能达到同样的效果 另外贴一篇讲虚函数的存在意义的知乎回答,写的实在太清楚了: 作者:乌索普 链接:https://www.zhihu.com/question/23971699/answer/84332610 虚函数主要是用来实现多态和多重继承的 没有虚函数理论上也可以实现多态,但是太麻烦了,没有虚函数清晰 主要是在多态上使用。 多态是什么呢: 多态就是一个指针指向子类对象,那么他调用的函数就是子类的对象的。 这就实现了什么? 实现了一个函数会根据传入参数的不同有不同的功能。 函数有多个状态。 就是多态 void fuck (Animal *a); 如果没有多态 那么 这个函数 只能fuck Animal 想要fuck多种 就要用重载,写多个同名函数 参数不同 但是有了多态 他可以fuck所有Animal的子类 比如牛 羊 耗子 什么的 根据传进来的参数不同,fuck不同的动物。 这样这个函数就是fuckAnimalYouWant

static,this指针

左心房为你撑大大i 提交于 2020-03-04 00:05:09
标题 this和static 老师上课讲这一块内容的时候,就不理解。现在把他整理一下。 ①this指针:指向成员函数所指向的对象 -------------理解this指针,首先将C++翻译成C class Test { public : int num ; void set ( int n ) { num = n ; } } ; int main ( ) { Test t ; t . set ( 20 ) ; return 0 ; } struct Test { int num ; } ; void set ( struct Test * this , int n ) { this - > num = n ; } int main ( ) { struct Test t ; set ( & t , 20 ) ; return 0 ; } -----------再来看下面这段程序,理解this指针 class Test { public : int p ; Test set ( int p ) { this - > p ++ ; return * this ; } } ; class A { public : int i = 0 ; void print ( ) { cout << i << "hello" << endl ; } //void print(A* this) //{

5/27 C语言 指针系列

时间秒杀一切 提交于 2020-03-03 21:07:09
1、序。数据在内存中是如何存储的,又是如何读取的? 在程序中定义一个变量,在对程序进行编译的时候,系统会给这个变量分配内存单元。编译系统根据程序中定义变量类型,分配一定长度的空间。 2、指针。 地址指向该变量的单元,地址指向该变量的单元,将地址形象化称作为指针,就是通过它能够找到以他为地址的内存单元。 3、访问。 访问分为直接访问和间接访问,直接访问是直接读取一个数据的地址,间接访问是通过中介访问自己的数据的地址,一般要进行两步以上。 4、指向。 一个变量的地址称为变量的指针,指针是通过地址来体现的。假设i_pointer中的值是变量i的地址的变量(2000),这样就在i—pointer和变量i中建议一种联系,通过i—pointer就知道i的地址,从而找到i的内存单元 来源: https://www.cnblogs.com/serious123/p/10934385.html

# 指针

不打扰是莪最后的温柔 提交于 2020-03-03 21:00:08
指针 http://c.biancheng.net/cpp/biancheng/view/173.html 指针是一种数据类型。被之前的错误写法误导了,以后从int *p改写成int* p;未初始化的指针地址为NULL,输出即为0; 类似于int p;//int 是一种数据类型,p是该类型的变量,P所占的空间大小是平台相关的,一般编译环境中 sizeof(p) == 4。 int* p=&var;//int*是一种数据类型(指向整数的指针类型),p 是该类型的变量,&i是赋与p的值(一个地址)p所占的空间大小是平台相关的,一般32位编译环境中 sizeof(p)==4,一般64位编译环境中 sizeof(p) == 8。 &i 是对 i 取址,生成一个 int* 类型、指向 i 的指针。 *p和var指的是var的内容;p和&var指的是var的地址 //*称为对指针的解引用,"*"的作用是引用指针指向的变量值,引用其实就是引用该变量的地址,“解”就是把该地址对应的东西解开,解出来,就像打开一个包裹一样,那就是该变量的值了,所以称为“解引用”。也就是说,解引用是返回内存地址中保存的值。 来源: https://www.cnblogs.com/sstealer/p/11331462.html

const关键字与指针

ぐ巨炮叔叔 提交于 2020-03-03 20:58:31
const关键字与指针 1、const关键字,在C语言中用来修饰变量,表示这个变量是常量。 2、const修饰指针有4种形式, 第一种:const int *p1; //p本身不是const的,而p指向的变量是const的 *p1 = 3;//错误的,const变量不能修改 p1 = 3; //正确的 第二种:int const *p2; //p本身不是const的,而p指向的变量是const的 *p2 = 3;//错误的,const变量不能修改 p2 = 3; //正确的 第三种:int * const p3; //p本身是const的,而p指向的变量不是const的 *p3 = 3;//正确的 p3 = 3; //错误的,const变量不能修改 第四种:const int * const p4; //p本身是const的,而p指向的变量是const的 *p4 = 3;//正确的 p4 = 3; //正确的 3、关于指针变量的理解,主要是涉及到两个变量:第一个是指针变量p本身,第二个是p指向的那个变量。一个const 只能修饰其中一个变量。 4、const在实际使用过程中,并不是一定不能被修改,通过一些特定的方法(比如说是指针)也是可以被修改掉的。 只是大部分情况下,我们既然定义了const类型的变量,就不会去修改这个变量。所以指针使用的时候,一定要谨 慎

指针草稿

旧时模样 提交于 2020-03-03 17:29:40
指针 内存,以一个字节为单位来分配内存 每个字节的内存都有标号,这个标号就是指针 指针需要存储,32位的编译器用32位(4字节)存储此地址,64位的用64位的(8字节)存储此地址 编码:为每个物理存储单元(一个字节)分配一个号码 寻址:根据分配的号码找到相应的存储单元,完成数据读写 char:占一个字节,分配一个地址 int:占四个字节,分配四个地址 定义一个变量,在程序编译或运行时,系统给这个变量分配内存的单元,并且确定他的内存地址 指针是内存的单元的编号,指针变量是存放地址的变量;我们通常把指针变量和指针都叫做指针; int a = 10; int* p = &a; //取出a的地址,赋值给p printf("%p\n%p\n",p,&a); //%p是打印地址,以十六进制的方式 printf("结束"); //&a和p的值相同 int b = *p; printf("%d\n",b); //*p是访问p位置的值,这里打印出a的值10 *p = 200; printf("%d\n",b); //b的值是10 printf("%d\n",a); //a的值是200 int a =10;分配一个空间给a,a的地址编号是0X123456,把10存放到a的空间; int *p = &a;分配一个空间给p,把a的地址编号0x123456存放到p的空间; 野指针

链表--链表中环的入口节点

你离开我真会死。 提交于 2020-03-03 10:41:22
此题设快慢两个指针,先判断是否有环:如果为环快慢指针终会相遇; 找入口节点:快慢指针相遇的节点到入口节点的距离,与从头节点开始新的慢指针到相遇点的距离相同。 可画图演示。因为快指针是慢指针的两倍速,且他们在q点相遇,则我们可以得到等式 2(A+B) = A+B+C+B.得出C=A function EntryNodeOfLoop(pHead){ if(pHead == null || pHead.next == null||pHead.next.next==null){ return null; } let fast = pHead; let slow = pHead; while(fast != null && fast.next != null){ fast = fast.next.next; slow = slow.next; if(fast == slow){ let slow2 = pHead; while(slow2 != slow){ slow2 = slow2.next; slow = slow.next; } return slow2; } } } 来源: https://www.cnblogs.com/mlebk/p/12396046.html