指针

ctypes给扩展模块中的函数传递数组和结构体

大城市里の小女人 提交于 2020-01-30 02:56:27
传递数组 楔子 下面我们来看看如何使用ctypes传递数组,这里我们只讲传递,不讲返回。因为C语言返回数组给python实际上会存在很多问题,比如:返回的数组的内存由谁来管理,不用了之后空间由谁来释放,事实上ctypes内部对于返回数组支持的也不是很好。因此我们一般不会向python返回一个C语言中的数组,因为C语言中的数组传递给python涉及到效率的问题,python中的列表传递直接传递一个引用即可,但是C语言中的数组过来肯定是要拷贝一份的,所以这里我们只讲python如何通过ctypes给扩展模块传递数组,不会介绍扩展模块如何返回数组给python。 如何传递 我们知道python中没有数组,或者说C中的数组在python中是一个list,我们可以通过list来得到数组,方式也很简单。 from ctypes import * # 创建一个数组,假设叫[1, 2, 3, 4, 5] a5 = (c_int * 5)(1, 2, 3, 4, 5) print(a5) # <__main__.c_long_Array_5 object at 0x00000162428968C0> # 上面这种方式就得到了一个数组 # 当然还可以使用list a5 = (c_int * 5)(*range(1, 6)) print(a5) # <__main__.c_long_Array_5

智能指针 unique_ptr

£可爱£侵袭症+ 提交于 2020-01-30 02:28:57
定义 unique_ptr 是 C++ 11 提供的用于防止内存泄漏的智能指针中的一种实现,独享被管理对象指针所有权的智能指针。 int main() { std::unique_ptr<int> num(new int(23)); cout << *num << endl; return 0; } move和get std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝所以可以提高利用效率,改善性能.。 get函数会返回存储的指针。如果由unique_ptr不为空,则存储的指针指向由unique_ptr管理的对象,否则指向nullptr。 #include<string> #include<cstring> #include<iostream> #include<queue> #include<map> #include<algorithm> #include<memory> using namespace std; int main() { unique_ptr<int> num(new int(23)); cout<<"value="<<*num<<" "<<" addr="<<num.get()<<endl; unique_ptr<int> num1=move(num); cout<<"value="<<*num1<<"

指针实现字符串插入

醉酒当歌 提交于 2020-01-30 02:11:14
指针的指示作用 # include <stdio.h> # include <string.h> # include <stdlib.h> void insert ( char * x , char * y , int i ) { //char *temp = NULL; //printf("拼接前的x字符串长度是%d\n", strlen(x)); //printf("拼接前的y字符串长度是%d\n", strlen(y)); char * temp = malloc ( 10 * sizeof ( char ) ) ; //strncat(temp, x, 2); //char string3[100]; //char *temp = string3; memset ( temp , '\0' , sizeof ( temp ) ) ; //该函数用来清除内存位置 strncpy ( temp , x , i ) ; /*for(int j = 0; j < strlen(temp); j++){ printf("%s", *(temp + i)); }*/ //printf("%s", temp); //printf("拼接后的temp字符串长度是%d\n", strlen(temp)); //printf("拼接后的x字符串长度是%d\n", strlen(x));

二级指针代码 C

北城余情 提交于 2020-01-30 02:02:05
# include <bits/stdc++.h> using namespace std ; int main ( ) { int a = 100 ; int * p1 ; int * * p2 ; //p1所存储的是a的地址 p1 = & a ; //p2所存储的是一级指针p1的地址 p2 = & p1 ; printf ( "p1的地址=%p,p1所指向的值是=%d\n" , p1 , * p1 ) ; printf ( "p2的地址=%p,p2所指向的值是=%p,p2所指向的地址所指向的值=%d" , p2 , * p2 , * * p2 ) ; return 0 ; } p1的地址 = 006 DFEF8 , p1所指向的值是 = 100 p2的地址 = 006 DFEF4 , p2所指向的值是 = 006 DFEF8 , p2所指向的地址所指向的值 = 100 来源: CSDN 作者: shuyan745294340 链接: https://blog.csdn.net/shuyan745294340/article/details/104109998

C++ STL之vector用法总结

混江龙づ霸主 提交于 2020-01-30 00:49:38
C++ STL之vector用法总结 介绍 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。 vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。 与其它动态序列容器相比(deques, lists and forward_lists), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起lists和forward

c++ 文件的简单操作

那年仲夏 提交于 2020-01-30 00:16:27
文件的读取操作 在程序设计中,文件常用的操作不外乎——打开、读、写、流指针操作、关闭。我日常中使用的比较多,但从来 没有细细总结今天就总结下具体的用法。 相关概念 计算机上的文件其实是数据的集合,对文件的读写其实是对数据的读写。 文件可以大致分为两种:文本文件和二进制文件。   1、文本文件:它的每一个字节存放的是一个ASCII码,代表一个字符。 2、二进制文件:将内存中的数据按照其在内存中的存储形式原样存放在磁盘上。我们用记事本打开则是乱码。 文件的路径 文件的相对路径(重在理解)——英文的双引号 定义:目标文件相对于当前文件的路径。 表达形式: (1)"./“或”.”表示显示当前目录,也可以省略,表示默认当前目录 (2)”…/"或”…”表示返回到上一级的目录。 (3)如果有多个上一级目录,可以使用多个“…/”或”…”。 文件的打开方式 (三)文件的打开方式 ios::in 以输入方式打开文件,支持读数据流。如果文件不存在会找不到文件。 ios::out 以输出方式打开文件,支持写数据流。如果文件不存在则新建,如果文件存在就清空其原有内容。 ios::app 输出的数据追加到文件末尾,只支持读,不支持写 ios::ate 打开一个文件,并将指针定位到文件末尾 ios::trunc 打开一个文件,如果文件不存在则新建,如果存在,则清空原有文件中的内容 ios::binary

线索二叉树

耗尽温柔 提交于 2020-01-30 00:11:58
线索二叉树 由于具有 N N N 个节点的二叉查找树有 N + 1 N+1 N + 1 的 N U L L NULL N U L L 指针,因此在二叉查找树中指定给指针信息的空间的一半被浪费了。 若一个节点有一个 N U L L NULL N U L L 左孩子,我们使它的左儿子指向它的 中缀前驱(inorder predecessor) ,若一个节点有一个 N U L L NULL N U L L 右孩子,我们让它的右儿子指向它的 中缀后继(inorder successor) 。这就叫做 线索二叉树(threaded tree) ,而附加的指针就叫做 线索(thread) 。 为使从实际的儿子指针中区分出线索,需要在每个节点增加一个成员,用以标志指针是线索还是孩子。 typedef enum { Linked , // 表示正常孩子 Thread // 表示线索 } PointerTag ; typedef int ElementType ; struct ThreadTree ; typedef struct ThreadTree * Tree ; typedef struct ThreadTree * Position ; struct ThreadTree { ElementType Element ; Tree Left ; Tree Right ;

Java - I/O流 随机访问

半腔热情 提交于 2020-01-30 00:01:02
RandomAccessFile 文件的随机访问指的是我们可以对文件访问任意位置的信息。而这个文件类就是 RandomAccessFile 。 关键成员变量以及方法: fileponiter : 文件指针,用来标记当前读取或者写入的位置。 getFileponiter() :返回当前文件指针的位置 seek() :设置当前文件指针的位置 构造器: RandomAccessFile(String pathname , String mode); RandomAccessFile(File file ,String mode); 第一个构造器,指定路径,内部创建一个File,给定模式。 第二个构造器,给定File,给定模式。 那么RandomAccessFile的模式有哪些呢? r:只支持读取 rw:支持读取和写入 rwd:支持读取和写入的同时,当我们修改文件内容和文件的元数据都会直接同步到存储设备上 rws:支持读取和写入,同时当我们修改文件内容会直接同步到存储设备上 (tips:文件的元数据:文件的大小,访问权限,本身的一些属性等等) 示例: public static void main ( String [ ] args ) { //我们对c.txt的内容进行随机访问,然后写入到d.txt; RandomAccessFile randomAccessFile = null ;

指针(二)

倖福魔咒の 提交于 2020-01-29 22:16:12
指针与数组 指向数组的指针 数组是内存中一块连续的区域,存储着相同类型的数据,在声明一个数组时,会开辟两个空间,一个用于保存数组元素,一个用来保存数组的第一个元素的地址,数组名就是用于保存数组第一个元素地址的指针。 指向一位数组的指针 int a1 [ 100 ] ; int n ; n = * a1 ; //n 为数组a1第一个元素的值 n = * ( a1 + 5 ) ; // 数组a1的第6个元素 尽管指针与数组之间有密切的关系,但是指针类型变量是可以不断进行赋值,在程序运行过程中可以发成变化,数组名虽然是指针,但是是一种指针类型的常量,只能指向固定的内存地址,不能将一个指针值赋值给一个数组名,同时在程序运行的过程中是不能发生改变。 指向多维数组的指针 例如:二维数组相当于一个二维表格,二维数组具有首地址,行首地址,元素地址等,数组名代表首地址,称为二维数组的指针,行首地址是二维数组中某一行的首地址,每行相当于一个一维数组,元素地址是二维地址中具体的分量。 int a [ 4 ] [ 5 ] ; // a代表整个二维数组的首地址,*a代表是第0行首地址,a[0]代表第i行的首地址 指向字符串的指针 char * str1 = "string1" ; 指针数组与指向指针的指针 指针数组 数组元素均为指针类型数据的数组。指针数组中的每个元素都相当于一个指针变量。 int * p

算法学习——双指针算法(最长连续不重复子序列)

ぐ巨炮叔叔 提交于 2020-01-29 18:14:04
双指针算法本质上就是将具有单调性的算法复杂度为O(N^2)的朴素算法通过双指针优化到O(n)的一种优化方法。是一种十分常用的算法。 设计双指针算法我们一般先写出它的朴素算法,然后按照模板: for( int i = 0, j = 0 ; i < n ; i ++) {   //check()是按照题目逻辑的判断函数   while( j <= i && check() ){     //不满足时     j ++;   }   //此处是按照题目逻辑的解答过程。 } 将其转换为双指针算法。 例题:最长连续不重复子序列 题解代码: #include<iostream> using namespace std; const int N = 1000010; int n; int a[N]; int cnt[N]; int main(){ int res = 0; scanf("%d",&n); for(int i = 0 ; i < n ; i ++ ) scanf("%d",&a[i]); for(int i = 0, j = 0 ; i < n ; i ++ ){ cnt[a[i]]++; while( cnt[a[i]] > 1 ){ cnt[a[j]]--; j++; } res = max(res , i - j + 1); } printf("%d\n",res);