指针

指针函数和函数指针有什么区别

北城余情 提交于 2019-12-20 09:00:52
1,这两个概念都是简称,指针函数是指带指针的函数,即本质是一个函数。我们知道函数都又返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。其定义格式如下所示: 返回类型标识符 *返回名称(形式参数表) { 函数体 } 返 回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该 地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。例如 下面一个返回指针函数的例子: 1 #include 2 3 float *find(); 4 main() 5 { 6 static float score[][4]={{60,70,80,90},{56,89,34,45},{34,23,56,45}}; 7 float *p; 8 int i,m; 9 printf("Enter the number to be found:"); 10 scanf("%d",&m); 11 printf("the score of NO.%d are:\n",m); 12 p=find(score,m); 13 for(i=0;i<4;i++) 14 printf("%5.2f\t",*(p+i)); 15 }

c语言中文件的使用方法

送分小仙女□ 提交于 2019-12-20 08:38:40
c语言中文件的使用方法 一.文件指针的定义 FILE * fp //注意FILE的大写 二.文件的打开 fp = fopen ( "(路径)文件名.文件格式后缀" , "文件的使用方法" ) //注意路径下为//而不是/ 三.文件的使用方法 1.“r” 模式: 1.1 打开文件进行只读操作,即只能从文件读取内容。 1.2 若欲操作的文件不存在,则打开失败。 1.3 成功打开文件时,文件指针位于文件开头。 1.4 打开文件后,不会清空文件内原有内容。 1.5 可从文件中任意位置读取内容。 2."w" 模式: 2.1 打开文件进行“只写”操作,即只能向文件写入内容。 2.2 若欲操作的文件不存在,则新建文件。 2.3 成功打开文件时,文件指针位于文件开头。 2.4 打开文件后,会清空文件内原有的内容。 2.5 可向文件中任意位置写入内容,且进行写入操作时,会覆盖原有位置的内容。 3."a" 模式: 3.1 打开文件进行“追加”操作,即只能向文件写入内容。 3.2 若欲操作的文件不存在,则新建文件。 3.3 成功打开文件时,文件指针位于文件结尾。 3.4 打开文件后,不会清空文件内原有内容。 3.5 只能向文件末尾追加(写)内容。 4."r+"模式: 4.1 打开文件进行“读写”操作,即既可读取,又可写入。 4.2 若欲操作的文件不存在,则打开失败。 4.3 成功打开文件时

利用c++实现哈希慢算法

丶灬走出姿态 提交于 2019-12-20 04:33:19
我想每个计算机专业的学生或多或少都接触过哈夫曼编码,数据结构中的老问题了。大体就是给出一些字符,和这些字符的出现频率,让你为这些字符设计一个二进制编码,要求频率最高的字符的编码最短。解决的方法是构造一棵哈夫曼树(二叉树),其基本思路是,每次从这些字符中挑出两个频率最低的,然后构造一个新的结点,使新结点的左右孩子指针分别指向那两个节点。我想这个大家都很清楚了,我就不多说了。主要讲下这次我用C++实现时遇到的问题。首先,我定义了一个哈夫曼树结点: class hNode {  public:   friend bool operator > (hNode n1,hNode n2); //定义了大于符号,供优先队列排列使用   hNode(string d="",int i=0,hNode* l = NULL,hNode* r =NULL):left(l),right(r),data(d),value(i){}   hNode* left;   hNode* right;   string data; //储存的字符串   int value; //字符串出现的次数 }; bool operator >(hNode n1,hNode n2) {  return n1.value > n2.value; } 仅仅只是存放数据的对象,所以只有一个构造函数,并且所有的data

12月19号

…衆ロ難τιáo~ 提交于 2019-12-20 04:31:15
指针 1、定义 基类型 * 指针变量名 2、赋值 int a; int *pa=&a;// int a,*pa=&a; int *p2; p2=&a; 两个运算符 & 取地址,后面操作数必须是变量 指针运算符,后面的操作数必须是指针 int a=3; int *pa=&a; &a 正确,表示a的地址 &pa 正确,表示pa的地址 *a 不对 *pa 正确,表示的是pa指向的变量,即a *&a 正确, 表示的就是a *&pa 正确,表示的是pa &*a 不对 &*pa 正确,表示的是pa,即&a, & * 如果正确使用,则两个运算符可以相互抵消 void exchange(int *p1,int *p2) { int t; t=*p1; *p1=*p2; *p2=t; } void exchange(int *p1,int *p2) { int *t; t=p1; p1=p2; p2=t; } 利用指针访问(引用)数组 通过下标遍历数组元素 int a[]={1,2,3,4,5}; a表示的是数组首元素的地址,是一个地址常量,不能改变,等价&a[0] int * pa=a;//指针变量pa指向数组首地址 int *pa=&a[0]; 如果指针变量指向数组的首地址,此时指针变量可以使用下标,即指针变量等同于数组名 a[1]====>pa[1] 当指针变量指向数组的时候

链表中倒数第k个节点--python

不打扰是莪最后的温柔 提交于 2019-12-20 01:06:52
#思路1:遍历两次链表:倒数的第k个相当于正数的n-k+1个节点,可以先遍历链表获得长度n,之后在重新遍历链表找到倒数的第k个节点。--需要遍历两次链表 #思路2:遍历一次链表:两个指针,第一个先走k-1步,之后第二个指针开始从头走,当第一个指针走到链表末尾的时候,第二个指针指向的地方就是倒数第k个节点 class ListNode ( object ) : def __init__ ( self , x ) : self . val = x self . next = None node1 = ListNode ( 1 ) node1 . next = ListNode ( 2 ) node1 . next . next = ListNode ( 3 ) node1 . next . next . next = ListNode ( 4 ) node1 . next . next . next . next = ListNode ( 5 ) def findRecK ( head , k ) : if k == 0 or head is None : return None p1 , p2 = head , head for i in range ( k - 1 ) : if p1 . next is not None : p1 = p1 . next else : #

使用指针互换两个数字

ε祈祈猫儿з 提交于 2019-12-20 00:21:52
程序运行结果:a = 2,b = 14;未能完成两个数字互换 程序分析:主函数将实参a、b传给形参c、d,改变的只是形参c、d的值,跟主函数的a、b没有任何关系,他们是4个不同的变量 形参接收参数后,互换的只是形参的值,跟实参没关系,函数执行之后释放空间。实参a、b没有发生任何变化。 接下来对程序进行修改,使用指针。 程序运行结果:a = 2,b = 14;未能完成两个数字互换 程序分析:图片通俗易懂。声明变量时,系统为此变量分配一块内存空间,调用swap_ys函数时,形参接收主函数的实参地址, 此时p地址变为1000H 指向a,q变为2000H指向b,经过内部代码块的编译,把p、q指向的地址给互换了,p此时指向b,q此时指向a。但a、b的内容和地址却没有发生变化。 不管p、q接收到的实参是什么内容,内部修改的只是形参,他们是不同的变量,修改p、q是不会影响到a、b的。 既然p指向的是a的地址,q指向的是b的地址。那么就是说 *p = a; *q = b; 那我直接互换*p、*q不就好了吗。 程序运行结果:a = 14,b = 2; 程序分析:p变量和a是不同的变量,只不过p变量保存了a变量的地址(类似 p = &a) 把a的地址发送给p,p就指向了a的地址,但p、a是不同的变量,互换p、q的值不会影响a、b的值 但是p既然指向了a的地址,*p就是a,*q就是b ,那直接互换*p,

图解c/c++多级指针与“多维”数组

北城余情 提交于 2019-12-19 23:22:28
声明: 本文为原创博文,如有转载,请注明出处。若本文有编辑错误、概念错误或者逻辑错误,请予以指正,谢谢。 指针与数组是C/C++编程中非常重要的元素,同时也是较难以理解的。其中,多级指针与“多维”数组更是让很多人云里雾里,其实,只要掌握一定的方法,理解多级指针和“多维”数组完全可以像理解一级指针和一维数组那样简单。 首先,先声明一些常识,如果你对这些常识还不理解,请先去弥补一下基础知识: 1、实际上并不存在多维数组,所谓的多维数组本质上是用一维数组模拟的。 2、数组名是一个常量(意味着不允许对其进行赋值操作),其代表数组首元素的首地址。 3、数组与指针的关系是因为数组下标操作符[],比如,int a[3][2]相当于*(*(a+3)+2) 。 4、指针是一种变量,也具有类型,其占用内存空间大小和系统有关,一般32位系统下,sizeof(指针变量)=4。 5、指针可以进行加减算术运算,加减的基本单位是sizeof(指针所指向的数据类型)。 6、对数组的数组名进行取地址(&)操作,其类型为整个数组类型。 7、对数组的数组名进行sizeof运算符操作,其值为整个数组的大小(以字节为单位)。 8、数组作为函数形参时会退化为指针。 一、一维数组与数组指针 假如有一维数组如下: char a[3]; 该数组一共有3个元素,元素的类型为char,如果想定义一个指针指向该数组

c++中引用与指针的区别

我怕爱的太早我们不能终老 提交于 2019-12-19 21:15:42
(1) 引用被创建的同时必须被初始化(指针则可以在任何时候被初始化) 。 指针与引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢? 首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。 (2)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL)。 不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性 。 (3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象) 总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。 还有一种情况,就是当你重载某个操作符时,你应该使用引用

5种智能指针指向数组的方法| 5 methods for c++ shared_ptr point to an array

半世苍凉 提交于 2019-12-19 12:55:13
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 本文首发于个人博客 https://kezunlin.me/post/b82753fc/ ,欢迎阅读最新内容! 5 methods for c++ shared_ptr point to an array <!--more--> Guide shared_ptr Prior to C++17 , shared_ptr could not be used to manage dynamically allocated arrays. By default, shared_ptr will call delete on the managed object when no more references remain to it. However, when you allocate using new[] you need to call delete[] , and not delete , to free the resource. In order to correctly use shared_ptr with an array, you must supply a custom deleter. code example //OK, pointer to int 999 std::shared_ptr

C++day05 学习笔记

南楼画角 提交于 2019-12-19 12:45:16
1、变量的存储 (1)内存是一块空间,把其中的每个字节做了编号,为了以后计算机能通过编号找到数据 (2)编址方式:绝对编址(在整个程序中使用),相对编址(字节相对于逻辑0偏移量,在进程中使用) 2、取变量地址 (1)"&" &i 表示取内存中i的地址 地址的编址用十六进制表示 (2)逻辑0在代码区 全局变量在数据区,地址的编址是大于0的 局部变量在栈区,地址的编址是小于0的 3、数组、结构的地址 (1)数组中的数据在内存中是连续存储的。 数组中每个元素的地址相差的值应为数组元素类型的大小。 (2)结构的地址: 结构的空间是连续的。 结构的起始地址与第一个成员变量的地址是一样的。 4、存储地址— 指针:存储变量的地址 指针的类型由将要保存的地址的变量类型决定 int*只能保存int变量的地址 指针赋值一定要是同类型的指针才能相互赋值! 5、指针的运算 (1)指针和指针之间的运算 “+”,“*”,“/” 指针与指针间是不能做这些运算,没有意义! “-” 可以做减法运算,以“sizeof(指针类型)”作为计算单位的! 注意:要同类型的指针才能做此运算,不同的话,会对运算单位产生歧义。 (2)指针和数字之间的运算(加、减都可以) int i = 100; int * p = &i; 打印 p+1 -> 相当于在地址上加4,因为存储的变量是int类型的 p+2 -> 相当于在地址上加8 6