指针

C语言:指针的几种形式

╄→尐↘猪︶ㄣ 提交于 2020-02-11 02:57:58
字符串的两种形式: 1、字符数组 char name[32] = “zhangsan”; //只能在初始化时这样做 strcpy(name,”lisi”); //整体赋值只能通过strcpy name = “lisi”; //error,将一个常量字符串的地址(“lisi")赋值给常量指针(char* const name) 2、字符指针 char *name = “zhangsan”; //指针变量name指向了常量字符串的开始地址 char* name; //在使用野指针(未初始化的指针) scanf(“%s”,name); //error, strcpy(name,”lisi”); //error,如果name指向了常量的字符串,会崩掉。 如果name没有初始化,程序有可能会崩掉,也有可能会覆盖内存中的数据。 name = “lisi”; //ok,重新修改指针变量name的指向,即指向一个新的字符串地址。 1、const int* p和int const* p:两者意义是相同的。指向的内容是只读数据,不可以q改变;但是指向的地址可以改变。 2、int* const p:必须先对指针初始化,而且指向的地址是只读的,不可以再被改变;但是指向的内容可以改变。 3、const int* const p:既不可以改变指针指向的地址,也不可以改变指针指向的内容。 来源: https:/

函数指针与回调函数

百般思念 提交于 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>

单链表

浪子不回头ぞ 提交于 2020-02-11 00:09:10
//单链表 //头指针 //1.头指针是指向链表的第一个节点的指针,若链表有头节点 //则是指向头节点的指针 //2.头指针具有标识作用,所以常用头指针冠以链表的名字 //3.无论链表是否为空,头指针均不为空,头指针是链表的必要元素 //头节点 /* *头节点是为了操作的统一和方便而设立的,放在第一元素的节点之前,其数据域一般无意义 *有了头节点,对于在第一元素节点前插入结点或者删除第一节点就变得与其他元素一样了 *头节点不一定是链表的必要元素 */ /*线性表的单链表定义*/ typedef struct node { elmentaye date; struct node *next;//c语言写法,要用自己来定义节点 } node; typedef struct node *linklist//定义一个指向结点的指针 /* 1.假设p是指向线性表第i个元素的指针,则节点a[i]的数据域可以用p->date来表示; 2.a[i]节点的指针域可以用p->next来表示,p->next是一个指针,指向下一个节点,p->next->data = a[i+1]; 3. */ //获得链表第i个数据的算法思路 /* 1.声明一个结点p指向链表的第一个结点,j从1开始 2.当j小于i时就让p指针向后移动,不断指向下一节点,j累加1 3.若链表尾p为空,就说明这个i元素不存在

「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

指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为參数,泛型函数

坚强是说给别人听的谎言 提交于 2020-02-10 19:30:11
 1、指针数组 数组里面的每一个元素都是指针。 指针数组的案比例如以下: 易犯错误: 2 、数组指针 归根结底还是指针,仅仅是取 * 的时候可以取出一整个数组出来。 数组指针:(一个指针指向了数组。一般和二维数组搭配使用)。 以下的( p+1 )表示的是加过 20 个字符。 3 、函数指针: 在 gcc 编译的时候添加一些调试信息的方式是: gcc demo.c –g –o app -g 表示添加一些调试信息 objdump –dSsx app > file 将 app 反汇编。然后重定向到 file 文件里。函数指针定义: 4 、指针作为參数 sizeof(p) sizeof(*p) p+1 char * p[10] 40 4 加过 4 个 Byte char **p 4 4 注意 sizeof ( **P ) = 1 加过 4 个字节 char (*p)(void) 函数指针 4 无大小 无意义 char (*p)[20] 数组指针 20 5 、 main 函数实质介绍: 6 、二重指针: 指针数组和二重指针实际上是等价的。 7 、数组指针等价于二维数组: 8 、函数指针作为函数的參数 9 、泛型函数: #include <stdio.h> #include <time.h> #include <stdlib.h> void show_arry(int a[], int n

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)指针的值在初始化后可以改变,即指向其它的存储单元,而 引用在进行初始化后就不会再改变 了。