指针

指针函数与函数指针

淺唱寂寞╮ 提交于 2020-01-09 02:06:14
指针函数:->int*p(); 函数指针:->int (*p)(); 定义char 类型的指针,返回字符串: 指针函数:使用指针作为返回值的函数 //指针函数 #include<iostream> char *getchar(char); char *getchar(char c){ switch(c){ case 'A':return "apple"; case 'B' :return "banana"; case 'C': return "Cat"; case 'D': return "Dog"; default: return "Nome"; } } int main(){ char input; printf("请输入一个字母"); scanf("%c",&input); printf("%s\n",getchar(input)) ; return 0; } 函数指针; //指针函数 #include<iostream> int square(int num){ return num*num; } int main(){ int num; int (*fp)(int); printf("请输入一个整数:"); scanf("%d",&num); fp=square; printf("%d*%d=%d ",num,num,(*fp)(num));printf("%d*%d=

[C++]C++面试知识总结

只谈情不闲聊 提交于 2020-01-08 23:40:04
1.程序运行知识 1.1 内存布局和分配方式 C程序的内存布局如下: 静态存储区:存储全局变量和static变量,通常在程序编译期间已经分配好了。 BSS段:存放未初始化的static变量和全局变量 Data段:存放初始化过的static变量和全局变量 Text段:存储程序的二进制代码,程序代码区。   堆:程序运行时通过malloc申请的内存区存放在堆中,需要使用free来释放该内存空间,生存期在malloc和free之间。 栈:执行函数时,函数的局部变量存储在栈中,执行结束后自动释放该内存区域,栈内存分配运算内置与处理器指令集中。 C++程序的内存布局与C程序布局类似,区别是C++不再区分全局变量和静态变量是否已经初始化,全部存储在静态存储区;另外堆中存放new/delete申请释放的资源,而malloc和free申请的资源存放在自由存储区。 1.2 内存溢出原因 栈溢出:越界访问造成,例如局部变量数组越界访问或者函数内局部变量使用过多,超出了操作系统为该进程分配的栈的大小,还有递归函数层次过多超过了栈大小。 堆溢出:程序申请了资源但忘记释放该资源,造成内存泄露,累积泄露内存过多会造成内存溢出。 1.3 内存泄露和检测 C++内存泄漏检测内存泄露是指程序中动态分配了内存,但是在程序结束时没有释放这部分内存,从而造成那一部分内存不可用的情况。 动态内存泄露检测:检查new

参数与指针

北城余情 提交于 2020-01-08 21:51:56
一个函数仅实现一个功能, 实参与形参: //实参与形参 #include<stdio.h> int sum(int x ,int y){ return(x+y); } int main(){ int a=sum(3,5); printf("%d",a); } 传值与传址: #include<stdio.h> void swap(int x,int y); void swap(int x,int y){ printf("互换前:%d %d \n",x,y); int tmp; tmp=x; x=y; y=tmp; printf("互换后:%d %d\n",x,y); } int main(){ int x=3,y=5; swap(3,5); printf("in main中%d %d",x,y); } #include<stdio.h> void swap(int *x,int *y); void swap(int *x,int *y){ printf("互换前:%d %d \n",*x,*y); int tmp; tmp=*x; *x=*y; *y=tmp; printf("互换后:%d %d\n",*x,*y); } int main(){ int x=3,y=5; swap(&x,&y); printf("in main中%d %d",x,y); } 传数组: #include

QT 基础语法

空扰寡人 提交于 2020-01-08 21:28:14
函数:定义 数据类型 函数名(参数列表) { 函数体 } 函数调用, 函数递归, 函数参数,函数返回值(类型指针和值), 函数指针, 变参函数 函数重载(函数名相同,函数参数列表不同) —编译器检查函数的时候同时检查函数名和参数列表 —强类型(指针,引用赋值类型必须一致) add(int , int) add(double, double) Int a =10; Char* p = (char*)&a; isqrt(int i); dsqrt(double i); —C语言 sqrt(int i) ; sqrt(double i); sqrt(float i); ----c++语言 函数重载 sqrt(10); sqrt(10.1);—c++默认的浮点型是double 使用方便–函数调用自动根据参数调用对应的函数 函数重载依据:函数名相同,函数参数列表不同(个数不同,类型不同),const(参数是引用,或者是指针),函数返回值不能作为函数重载依据 练习:用函数重载实现打开lcd设备(多种方式打开设备) 在ubuntu字符界面测试 ctrl+alt+f1 int open() int open(const char *dev) —————————————————————————————————— 函数默认参数 int open(const char *dev=”/dev/fb0”,

分离头指针(detached HEAD)

余生颓废 提交于 2020-01-08 11:58:10
通常,我们工作在某一个分支上,比如 master 分支。这个时候 master 指针和 HEAD 指针是一起前进的,每做一次提交,这两个指针就会一起向前挪一步。但是在某种情况下(例如 checkout 了某个具体的 commit),master 指针 和 HEAD 指针这种「绑定」的状态就被打破了,变成了分离头指针状态。我那天遇到的情况是,master 和 HEAD 指针看上去指在同一个 commit 上,但其实已经处在分离头指针状态。当我在此时又做了一次新的提交时,HEAD 指针跑到 master 指针前面去了。如果我直接检出 master 分支,HEAD 指针就会回退一格到 master 指针的位置,而最新的那次提交就变成了孤立的提交,没有任何分支能追踪到它,刚才的活白干了。 # 强制将 master 分支指向当前头指针的位置 $ git branch -f master HEAD # 检出 master 分支 $ git checkout master 参考:https://blog.csdn.net/qq_40718168/article/details/89521028 来源: https://www.cnblogs.com/ch122633/p/12165146.html

调用指针,判断

一曲冷凌霜 提交于 2020-01-08 11:49:54
const CPDF_Font* stock_font =CPDF_Font::GetStockFont(cpdf_doc_, "sysfFZFS"); // const uint8_t* data = stock_font->GetFont()->GetFontData(); // const uint32_t size = stock_font->GetFont()->GetSize();   调用任何指针,判断是否为空??? 避免程序段错误,崩溃 来源: https://www.cnblogs.com/hshy/p/12165243.html

链表知识总结

岁酱吖の 提交于 2020-01-08 09:34:39
一、什么是链表? 和数组一样,链表也是一种线性表。 从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构。 链表中的每一个内存块被称为节点Node。节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next。 二、为什么使用链表?即链表的特点 插入、删除数据效率高O(1)级别(只需更改指针指向即可),随机访问效率低O(n)级别(需要从链头至链尾进行遍历)。 和数组相比,内存空间消耗更大,因为每个存储数据的节点都需要额外的空间存储后继指针。 三、常用链表:单链表、循环链表和双向链表 1.单链表 每个节点只包含一个指针,即后继指针。 单链表有两个特殊的节点,即首节点和尾节点。为什么特殊?用首节点地址表示整条链表,尾节点的后继指针指向空地址null。 性能特点:插入和删除节点的时间复杂度为O(1),查找的时间复杂度为O(n)。 2.循环链表 除了尾节点的后继指针指向首节点的地址外均与单链表一致。 适用于存储有循环特点的数据,比如约瑟夫问题。 3.双向链表 节点除了存储数据外,还有两个指针分别指向前一个节点地址(前驱指针prev)和下一个节点地址(后继指针next)。 首节点的前驱指针prev和尾节点的后继指针均指向空地址。 性能特点: 和单链表相比,存储相同的数据,需要消耗更多的存储空间。 插入、删除操作比单链表效率更高O

B+树与B*树小结

只愿长相守 提交于 2020-01-08 09:31:45
一、B+树 1.B+树定义与特性 B+ 树是 B- 树的变体,也是一种多路搜索树: 其定义基本与 B- 树同,除了: 1). 非叶子结点的 子树指针与关键字个数相同 ; 2). 非叶子结点的 子树指针 P[i ] ,指向关键字值属于 [K[i], K[i+1]) 的子树 ( B- 树是开区间); 3). 为所有叶子结点 增加一个链指针 ; 4). 所有关键字都在叶子结点出现 为了全面 这里给出网上另外一种说法: 一棵m阶的B+树和m阶的B树的差异在于: 1.有n棵子树的结点中含有n个关键字; (而B 树是n棵子树有n-1个关键字) 2. 所有的叶子结点中包含了全部关键字的信 息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息) 3. 所有的非终端结点可以看成是索引部分 ,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息) 下图给出典型的3阶B+树示例 B+ 的特性: 1). 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好 是有序的; 2). 不可能在非叶子结点命中; 3). 非叶子结点相当于是叶子结点的索引 (稀疏索引),叶子结点相当于是存储 (关键字)数据的数据层; 4). 更适合文件索引系统; 2.B+树的基本操作 1)查找操作

地址、指针与引用

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

数组与指针

北战南征 提交于 2020-01-08 06:44:55
#include<stdio.h> int main(){ int a; int *p=&a; printf("输一个整数\n") ; scanf("%d",&a); printf("a=%d",a); printf("输一个整数\n") ; scanf("%d",p); printf("a=%d",a); } 对字符串; #include<stdio.h> int main(){ char str[123]; printf("输入一个字符串"); scanf("%s",str) ; printf("str=%s",str); } 数组名的真实身份: #include<stdio.h> int main(){ char str[123]; printf("输入一个字符串"); scanf("%s",str) ; //printf("str=%s",str); printf("%p\n",str); printf("%p",&str[0]); } #include<stdio.h> int main(){ char a[]="hello,,world!"; int b[5]={1,2,3,4,5}; float c[5]={1.1,1.2,1.3,1.4,1.5}; printf("a[0]=%p\n a[1]=%p\n a[2]=%p\n",&a[0],&a[1],&a[2]);