指针变量

C博客作业--指针

自古美人都是妖i 提交于 2020-01-31 00:21:49
一、PTA实验作业 题目1:6-2 求出数组中最大数和次最大数 1. 本题PTA提交列表 2. 设计思路 定义函数int fun ( int *a, int n ) 定义变量i,j表示下标,iindex=0表示最大值下标,max表示最大值,t表示交换中介 for i=0 to 1 for j=i to n-1 max←下标为index的数组元素*(a+index) 寻找数组中从下标为 j 开始的最大值 IF max<*(a+j) index←j 把最大值的下标赋给index 交换a[i]和a[index] end for 返回*a 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明。 开始时认为只是类似于冒泡排序于是把所有数组元素进行了排序,发现c++上答案和pta不一样后发现只需要做冒泡排序的前两次即可 题目2:6-3 统计大于等于平均分人数 1. 本题PTA提交列表 2. 设计思路 定义函数int fun ( float *s, int n, float *aver ) 定义整型变量i,浮点型变量sum=0表示成绩之和,result表示大于等于平均分的同学个数 for i=0 to n-1 将所有输入的成绩求和 end for 计算平均分 *aver=sum/n for i=0 to n-1 IF(输入的数组元素*(s+i)大于等于平均分*aver) result+

心跳与超时:高并发高性能的时间轮超时器

試著忘記壹切 提交于 2020-01-30 19:59:12
心跳与超时:高并发高性能的时间轮超时器 文章目录 心跳与超时:高并发高性能的时间轮超时器 引言 JDK 原生提供的超时任务支持 java.util.Timer ScheduledThreadPoolExecutor 更高效的数据结构 基本原理 支撑更多超过范围的延迟时间 方案一:不同轮次的延迟任务共存相同的延迟队列 方案二:多层次时间轮 Netty 的时间轮实现 接口定义 构建循环数组 新增延迟任务 工作线程workerThread 线程启动与准备工作 驱动指针和任务触发 时间轮停止 思考总结 引言 在许多业务场景中,我们都会碰到延迟任务,定时任务这种需求。特别的,在网络连接的场景中,常常会出现一些超时控制。由于服务端的连接数量很大,这些超时任务的数量往往也是很庞大的。实现对大量任务的超时管理并不是一个容易的事情。 本章我们将介绍几种用于实现超时任务的数据结构,并且最后分析 Netty 在超时任务上采取的结构和代码。 欢迎加入技术交流群186233599讨论交流,也欢迎关注笔者公众号:风火说。 JDK 原生提供的超时任务支持 java.util.Timer JDK 在 1.3 的时候引入了 Timer 数据结构用于实现定时任务。 Timer 的实现思路比较简单,其内部有两个主要属性: TaskQueue :定时任务抽象类 TimeTask 的列表。 TimerThread

15. 三数之和(leetcode)

南笙酒味 提交于 2020-01-30 13:41:15
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 我一拿到这题,就想着暴力破解,三重循环,i<j<k,这样也不用担心遍历重复了,但是这题还要考虑,给定的数组 nums 里元素重复。 答案思路:双指针法,用双重循环,其中一层循环双指针,一个循环两个变量,时间复杂度就减少了。   第一层固定元素k,第二层循环指针 i,j   k<i<j 收获:   1.本题学到了双指针法,一个指向头,一个指向尾,A情况头指针++,B情况尾指针--,C情况 头指针++ 尾指针--;   2.学会了遍历List时候 去重的程序写法,看起来很舒服。     i += 1     while i < j and nums[i] == nums[i-1]: i += 1     注: 是 i == i-1 不是 i == i+1 : 因为是判断现在与过去,不是现在与将来。 class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: if len(nums) < 3: return None nums.sort() res = [] k = 0 while k < len(nums): if nums[k] > 0 :

结构体中定义函数指针

做~自己de王妃 提交于 2020-01-30 11:10:10
结构体指针变量的定义 定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct 结构体标识符 {   成员变量列表;… }; struct 结构体标识符 *指针变量名; 变量初始化:struct 结构体标识符 变量名={初始化值1,初始化值2,…,初始化值n }; 形式2:在定义类型的同时定义变量 struct 结构体标识符 {   成员变量列表;… } *指针变量名; 形式3:直接定义变量,用无名结构体直接定义变量只能一次 struct {   成员变量列表;… }*指针变量名; 其中“指针变量名”为结构体指针变量的名称。形式1是先定义结构体,然后再定义此类型的结构体指针变量;形式2和形式3是在定义结构体的同时定义此类型的结构体指针变量。 函数指针的定义 一般的函数指针可以这么定义:    int (*func)(int,int); 表示一个指向含有两个int参数并且返回值是int形式的任何一个函数指针. 假如存在这样的一个函数: int add2(int x,int y) {   return x+y; } 那么在实际使用指针func时可以这样实现: func=&add2; //指针赋值,或者func=add2; add2与&add2意义相同 printf("func(3,4)=%d\n",func(3,4)); 事实上,为了代码的移植考虑

结构体变量 和 结构体指针

独自空忆成欢 提交于 2020-01-30 10:24:57
为什么结构体在声明变量不需要去动态的分配内存,而声明结构体指针后,如果对成员进行操作需要分配内存,或者需要定义。 首先变量的声明与定义: extern int i; //声明,不是定义 int i; //声明,也是定义 编译器会随机分配一个定义给i,这个地址肯定是合法的。 然后指针变量的声明与初始化: int *i; //声明一个指针变量 *i = 3; //直接将值赋值给i所指向的地址。因为我们未对i进行初始化,所以我们也不知道i到底指向哪。有一点可以肯定的是这个地址不会是存储变量的内存空间,有兴趣的可以将这个值打印出来分析。(有关内核空间的内存有机会总结一篇) 现在回到结构体,直接看下图 我们会发现结构体指针变量的地址为0,这显然不是一个合法的地址,所以后面的赋值操作就会发生段错误。 所以必须对指针初始化,所谓的初始化就是让指针指向一个合法有效的内存空间,而分配空间的方法有两种:静态分配,动态分配。下面的是静态的,动态的就是malloc()函数 这个就可以正常的赋值。 来源: https://www.cnblogs.com/hgstudy/p/9610985.html

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

指针(二)

倖福魔咒の 提交于 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

无类型指针、空指针和野指针

笑着哭i 提交于 2020-01-29 17:57:49
1、无类型指针:void *p; 不指定它指向具体哪种数据类型。可以通过强制转化将void *转化为其他类型指针,也可以用(void *)将其他类型指针强制转化为void类型指针。指针之间赋值需要类型相同,但任何类型的指针都可以赋值给void *。 2、空指针:NULL NULL在C语言中的定义为(void *)0。空指针就是指向了NULL的指针变量。如果一个指针不能确定指向任何一个变量的地址,应将这个指针设置为空指针。 3、野指针 野指针,没有指向任何有效地址的指针变量,所以在代码中避免出现野指针。 来源: CSDN 作者: 星尘亦星辰 链接: https://blog.csdn.net/Mrweng1996/article/details/104106415

烦人的const 把我搞晕了

寵の児 提交于 2020-01-29 10:48:11
转载 自CSDN博客: http://blog.csdn.net/eroswang/archive/2009/05/20/4204693.aspx Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。 一、Const作用 如下表所示: 1 可以定义const常量   const int Max = 100; 2 便于进行类型检查 const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误 void f(const int i) { .........} //对传入的参数进行类型检查,不匹配进行提示 3 可以保护被修饰的东西 防止意外的修改,增强程序的健壮性。 void f(const int i) { i=10;//error! } //如果在函数体内修改了i,编译器就会报错 4 可以很方便地进行参数的调整和修改 同宏定义一样,可以做到不变则已,一变都变   5 为函数重载提供了一个参考   class A { ...... void f(int i) {......} //一个函数 void f(int i) const {......} //上一个函数的重载 ...... }; 6 可以节省空间

const关键字

不打扰是莪最后的温柔 提交于 2020-01-29 07:12:56
const关键字 写过一些知识点的文章,但是写的都比较粗糙,总是自己学会了就简略的写一下,自己都看不下去了,从今天开始,认真的写每一篇文章,尽量使像我第一样的的菜鸡也可以理解、明白。 下面主要介绍const关键字的四个作用。 ps:不保证所说的每一话都正确 请大佬略过 小白可以看看。 1:const 和普通变量 2:const 和指针 3:const 和函数 4:const 和类及其对象 1.const 和普通变量 这个是最简单最容易理解的,在声明变量时,在前面加上一个const 这样就定义了一个常量,比如:const float pi = 3.14或者float const pi = 3.14 ,两者一样,此时pi就成为了一个常量。 2. const和指针 这个主要包含两个名词 :指针常量、常量指针 我在初学的时候,一直记不清或者说记混这两个名字,今天在这里分享一下记忆的方法。简单点说,谁在前面谁就是不可改变的,比如说:常量指针,常量在前面,这个就是const在修饰那个常量,常量就不能改变,这个指针的值可以改变,在下面我会附上代码 进行展示。指针常量类似。正式一点说就是const这个关键字修饰谁,谁就是常量,就是不能被改变。 const int *p = &a; 常量指针一旦初始化完成,它的值,也就是它所放在指针中的地址就不能变 int const *p = &a; /