指针变量

函数指针与回调函数

百般思念 提交于 2020-02-11 02:19:02
函数指针与回调函数 函数指针 函数指针是指向函数的指针变量。 通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。 函数指针可以像一般函数一样,用于调用函数、传递参数。 函数指针变量的声明: typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针类型 eg: #include<bits/stdc++.h> using namespace std; int max(int a, int b) { return a > b ? a : b; } int main() { int (*p)(int, int) = &max; int a = 2, b = 1, c = 3, d = 0; cout << p(a, b) << endl; } 回调函数 回调函数是指函数指针作为某个函数的参数 函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。 简单讲:回调函数是由别人的函数执行时调用你实现的函数。 #include<bits/stdc++.h> using namespace std; void populate_array(int *array, int arraySize, int (*getNextValue)(void)) { for (int i = 0; i <

C++ 与OpenCV 学习笔记

♀尐吖头ヾ 提交于 2020-02-11 02:12:03
依赖:指针是一个变量,指向本体;引用只是一个别名(本体的另一个名字),绑定在主体上 可变:引用只能在定义时被初始化一次,且“从一而终”;指针可以修改,“见异思迁”; 可空:引用不能为空;指针可以为空; 大小:sizeof 引用,得到的是所指向变量的大小;sizeof 指针,得到的是指针的大小; 自增:指针 ++,是指指针的地址自增;引用++是指所指变量自增; 类型:引用是类型安全的,引用过程会进行类型检查;指针不会进行安全检查; 联合体:当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union) 1. 联合体是一种结构; 2. 他的所有成员相对于基地址的偏移量均为0; 3. 此结构空间要大到足够容纳最“宽”的成员;   //但是其大小不仅仅由最宽的成员决定,还需要考虑每个成员的自身对齐方式! 4. 其对齐方式要适合其中所有的成员。 const作用: c++编译器会在编译时,把常量优化成立即数,减少内存访问。因此,能够使用const的变量(在运行过程中不会发生变化的变量),尽量使用const去修饰。 特别是处理矩阵以及图像指针运算时。 inline function 内联函数: 函数调用的开销是很大的,如果有一段短小而需要频繁调用的函数,可以写为内联函数。 也就是建议编译器在函数调用点上展开代码后再进行编译。 这里的建议意思是,如果函数较复杂,编译器是不会内联的

指针总结与地址

倾然丶 夕夏残阳落幕 提交于 2020-02-11 02:11:52
指针是为了方便对地址直接操作而增加的一个中间操作符。 根据软件中间层的概念: 变量直接由高级操作; 地址直接由低级语言操作; 指针贯通高级语言与低级语言之间,是一个幽灵类型,直接对内存地址和内存地址中的数据双向操作。 最近在温故《C ++ primer》这本书,其中有一句话非常经典: When attempting to understand pointer declarations, read them from right to left. 为什么要有指针: 内存寻址的变种,是内存操作的接口; 方便数据在内存层面的组织;是数据结构的的核心支持; 是内存管理的有效工具; 提供了控制流跳转的开发层面支持。 变量:内存内容的标示;编程语言的直接操作对象;实质是操作内存对象; 存在于可执行文件的符号表中;在进程中没有存在,进程中只有内存数据。 指针的概念:(变量、类型、访问) 1)指针变量是一种特殊的变量; 2)指针变量作为变量,里面的数据是内存地址; 3)指针的类型决定了指针访问的内存大小; 4)指针内容语意:指针变量包含地址指向的内存单元的内容。 变量是与数据对应的概念。 指针变量是与内存地址对应的概念。 指针的本质是内存地址;变量的本质是内存数据。 指针可以无差别的访问进程的任何内存单元。 指针的操作: 指针的操作提供了内存的便捷访问方式(遍历、查询)。 指针的形式: 一

C语言------结构体和共同体

给你一囗甜甜゛ 提交于 2020-02-11 01:07:37
1.结构体是一种构造类型,它是由若干成员组成的,其中每个成员可以是一个基本数据类型或者是一个构造类型。声明结构体时使用关键字struct。 2..声明一个结构体表示的是创建一个新的类型名,要用新的类名再定义变量,定义方式有三种:   A.声明结构体,然后再定义变量。     struct Product     {成员列表};     struct Product product1;     struct Product product2;   B.在声明结构类型时,同时定义变量。     struct Product     {       char cName[10];       char cShape[20];     }product1, product2;     PS:注意变量的名称要放在最后的分号前面;定义的变量不是只能有一个,可以定义多个变量    C.直接定义结构体类型变量。     struct     {       成员列表     }变量名列表; 3.在引用结构体的成员时,可以在结构的变量名的后面加上成员运算符"."和成员的名字,例如:product1.cName 4结构体类型与其他基本类型一样,可以在定义结构体变量时指定初始值。例如:   struct Student   {     char cName[20];     char cSex;    

C++中的智能指针

走远了吗. 提交于 2020-02-11 00:09:44
C++中的智能指针 C++ 中的四个智能指针分别是 1.shared_ptr 2.unique_ptr 3.weak_ptr 4.auto_ptr(已经被c++11弃用)(在c++11的环境中会爆警告warning: 'auto_ptr' is deprecated) 智能指针的作用 智能指针的作用是管理一个指针。 因为存在以下这种情况: 申请的空间在函数结束时忘记释放,造成内存泄漏。 使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个 类 ,当超出了类的作用域是,类会自动调用 析构函数 , 析构函数 会自动释放资源。所以智能指针的作用原理就是在 函数结束时自动释放内存空间 ,不需要手动释放内存空间。 所以智能指针的设计思想简单的来说就是: 将基本类型指针封装成类(模板类)对象指针,并且在析构函数里编写delete语句删除指针所指向的内存空间 智能指针的使用 智能指针所在的头文件:#include 智能指针都有一个explicit构造函数(显式构造函数) templet<class T> class auto_ptr{ explicit auto_ptr(X* p=0); } 所以智能指针的调用都只能显示调用 eg: #include<bits/stdc++.h> using namespace std; int main(){ shared_ptr<double>

「C」 数组、字符串、指针

三世轮回 提交于 2020-02-10 23:06:51
一、数组 (一)数组   概念:用来存储一组数据的构造数据类型   特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素。 (二)数组的定义   格式: 类型 数组名[元素个数];   举例:存储5个人的年龄   int agrs[5]; // 在内存中开辟4x5=20个字节的存储空间   可以在定义数组的同时对数组进行初始化:   int ages[5] = {17,18,19,20,21};   遍历数组:   for(int i = 0;i<5;i++)   {     printf(“ages[%d]=%d\n”,i,ages[i]);   }   注意:   (1)数组的初始化     ①. int ages[5] = {17,18,19,20,21}; // 一般写法     ②. int ages[5] = {17,18}; // 只对前两个元素赋值     ③. int ages[5] = {[3]=10,[4]=11}; // 对指定的元素赋值,这里为第三个和第四个     ④. int ages[] = {11,12,13}. // 正确,右边的元素确定,则个数可以省略这里为3个。     ⑤. int ages[]; // 错误,编译器无法知道应该分配多少的存储空间     ⑥. int ages[5];ages = {17

C++ 拾遗

眉间皱痕 提交于 2020-02-10 19:29:24
一、c++两个基本的运算符: &(取址运算符) 和 *(间接访问运算符/解引用指针) 首先是&运算符:当它后面跟一个变量名的时候,给出这个变量名的地址. #include <iostream> using namespace std; int main() { int a=5,b=6,c=7,d=8; double e=3.1415; //单独赋值,并且*和p_a紧挨着 int *p_a=&a; //多个赋值(既有指针,又有普通变量) int * p_b=&b,* p_c=&c,*p_d=&d,temp=100; //单独赋值,double类型 double * p_e=&e; } 二、指针和引用的定义和性质区别: (1)指 针是一个变量,只不过这个变量存储的是一个地址 ,指向内存的一个存储单元;而 引用跟原来的变量实质上是同一个东西 ,只不过是原变量的一个 别名 而已。如: int a=1;int *p=&a; int a=1;int &b=a; (2)可以有const指针,但是没有const引用; (3) 指针可以有多级 ,但是引用只能是一级(int **p;合法 而 int &&a是不合法的) (4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化; (5)指针的值在初始化后可以改变,即指向其它的存储单元,而 引用在进行初始化后就不会再改变 了。

关于链表中指针的学习

女生的网名这么多〃 提交于 2020-02-10 19:28:46
  昨天晚上在学习数据结构关于链表的部分,理解链表没什么难度,但是当自己动手写程序的时候各种问题就出来了,感觉逻辑很正常但是总得不到正确的结果。 首先自己对C语言指针理解的不是很深入,在定义链表节点的结构体时,定义了一个指针类型的变量指向结构体如代码所示:    1 typedef int status; 2   typedef struct Node{ 3    status data; 4    Node *next; 5   }Node,*linklist;   然后在main函数中定义一个指向结构体的指针变量如 linklist L;   在main函数之外声明一个创建链表的函数    1 void Create_list(linklist L1,int n){ 2    linklist p; 3    L1 = (linklist)malloc(sizeof(Node)); 4    L1->next = NULL; 5    for(i = 0;i < n; i++){ 6    p = (linklist)malloc(sizeof(Node)); 7    p->data = i; 8    p->next = L1->next; 9    L1->next= p; 10   } 11   } Create_list函数采用的事头插法添加链表节点,经过main

嵌入式常见面试题目

て烟熏妆下的殇ゞ 提交于 2020-02-10 18:53:28
嵌入式常见面试题目 Heap(堆)和stack(栈)的区别 全局变量与局部变量的区别 结构体和联合体的区别 数组与指针的区别 指针函数与函数指针的区别 常量与变量的区别 指针自增自减与变量自增自减有什么区别 #error的作用是什么 #include Heap(堆)和stack(栈)的区别 堆上的空间是手动分配与释放的,栈上的空间是自动分配与释放的。堆的空间是有限的,堆的空间是最大的自由储存区。 全局变量与局部变量的区别 作用域不同:全局变量的作用域为整个程序,局部变量的作用域为当前语句块; 内存储存方式:全局变量存储在全局数据区,局部变量存储在栈上; 生命周期不同:全局变量的生命周期和程序一样,局部变量随着语句块的结束而结束; 当局部变量与全局变量同名时,优先使用局部变量,使用全局变量是要用域成员运算符 结构体和联合体的区别 结构体和联合体都是由不同的数据类型组成,但在任何时刻,联合体只存在一个被选中的成员,结构体所有成员都存在。 在结构体中,各成员占有自己的储存空间,总大小等于各成员的大小之和 在联合体中,所有成员公用一块储存空间,其大小等于联合体中最大成员的大小 数组与指针的区别 数组要么在静态存储区,要么在栈上被创建。数组名对应着一块内存,其容量与地址在生命周期内保持不变。 指针可以随时指向任意类型的内存块,他的特征是可变。比数组灵活,但也危险。 指针函数与函数指针的区别

C++中的const

自闭症网瘾萝莉.ら 提交于 2020-02-10 18:31:47
1.修饰变量 const int i = 0; // i 为常量,不可修改 const int* p = &i; // 指向常量的指针 int const *p = &i; // 指针为常量,指向i不可修改 const int &r = i; // 常量引用,不可通过r修改i typedef int *po; const po p = &i; // 此时const修饰的是 int* ,所以此时指针是常量 顶层const:指针本身是常量 底层const:指针所指向的对象是常量 2.修饰函数(包括返回值,参数,函数体) const int fun(){...} // 函数返回值为常量 void fun(const int a, const int b){...} //函数参数为常量 const如何修饰函数体(主要修饰类的成员函数): class TestClass { public: TestClass() : val(100) {} ~TestClass() {} int getVal_v1() { return val; } int getVal_v2() const {     // val ++; 编译报错,常量成员函数不可修改数据成员 return val; } private: int val; }; int main() { TestClass t; int a = t