指针数组

指针学习

独自空忆成欢 提交于 2020-01-14 02:19:42
程序中定义的变量,在编译时,系统会给这个变量分配内存单元,根据数据类型,分配一定的长度空间。如Visual C++为整型变量分配4个字节,float分配4个字节,对char分配1个字节,内存区的每个字节有一个编号,这就是“地址”。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元,将地址形象的称为”指针”,即一个变量的地址称为该变量的” 指针 ” 。 指针变量 ,也是地址变量; 如: int i=3; / 定义整型变量并初始化 int *i_pointer; / 定义整型数据的指针变量 i_pointer=&i; / 将i 的地址存放到i_pointer中,比如变量i 所占用单元的起始地址为2000,那么i_pointer=2000 。 *i_pointer=3; 其中*i_pointer 表示指向的对象,指向就是通过地址来实现的。通过i_pointer=2000的地址指向该变量单元,即 i 的值为3.。 例中变量i 的指针为2000(地址),指针变量i_pointer 只是存放地址的变量,不能说i的指针变量是2000。 定义指针变量: 类型名 *指针变量名; 如:int *pointer_1; 对它 初始化 还可以写成int *pointer_1=&a ; 上面定义的指针变量前面的" * " 表示该变量的类型为指针类型,在定义指针变量时 必须指定基类型

支持内部晋升的无锁并发优先级线程池

蓝咒 提交于 2020-01-14 02:12:41
支持内部晋升的无锁并发优先级线程池 文章目录 支持内部晋升的无锁并发优先级线程池 引言 推导过程 如何实现优先级晋升 数据结构设计 一个指针产生的问题 任务插入指针和任务读取指针 任务插入指针如何移动 任务插入指针移动到同一位置导致的优先级任务混合问题 任务读取指针如何移动 插入和读取并发 代码实现 任务插入 任务的读取 包装为BlockQueue 效果展现 代码托管地址 引言 在技术群讨论到一个有意思的业务需求,可以描述为: 有一个内部按照优先级进行任务排序的线程池。线程池会优先执行高优先级的任务。随着时间的流逝,线程池内部低优先级的任务的优先级会逐渐晋升变为高优先级,以避免被不断新增的高优先级任务阻塞导致饿死。 考虑到 JDK 已经为开发者提供了自定义线程池 ThreadPoolExecutor 以及优先级队列 PriorityBlockingQueue ,两者相结合并且定期调整队列中低优先级任务的优先级再进行 resort 将低优先级的任务调整到队列的前头,也可以一定程度上避免被饿死。 这种方案的问题在于 resort 的消耗比较高,并且还需要重新计算每一个任务的优先级。为此,引出我们下面的设计,希望使用无锁并发的数据结构存储任务,并且任务支持自动的优先级晋升,保证低优先级的任务最终能够执行而不会被不断增加的高优先级任务饿死。 欢迎加入技术交流群186233599讨论交流

错题集

僤鯓⒐⒋嵵緔 提交于 2020-01-13 07:24:18
错题集 直接访问就是直接利用变量的地址直接进行访问。 (√) //直接访问就是系统直接将变量所在内存单元的值取出,间接访问是直接访问变量地址。 结构体类型本身不占用内存空间,结构体变量占用内存空间。 (√) // 结构体类型的定义只是告诉编译器该如何表示数据,但是它没有让计算机为其分配空间。结构体类型的定义就是结构体的声明,不管是定义还是申明,这句话都是正确的。只有在结构体变量,声明的时候可以分配。要使用结构体,那么就需要创建变量,也就是结构体变量。 文件指针用于指向文件,文件只有被打开后才有对应的文件指针。 (√) //文件指针是指向一个文件的指针,确切的将是指向用文件这个结构体所定义的对象的起始地址。 变量被定义后 , 它的作用域和寿命就被确定了 , 并且不可改变。 (√) //作用域就是一个变量可以被引用的范围,生命周期就是这个变量可以被引用的时间段。每个作用域都有相对应的生命周期,变量被定义后,作用域和生命周期就被确定了 , 并且不可改变。 两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。(√) //实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。 在c语言中,不允许有常量的数据类型是(B ) A.整型 B.结构型 C.字符型 D.字符串 //结构型是基本数据类型的组合,没有单独的常量。 文件指针和位置指针都是随着文件的读写操作在不断改变

Go 基础语法

只谈情不闲聊 提交于 2020-01-13 03:05:02
转自:http://studygolang.com/topics/548 例子Packages.go: package main import ( "fmt" "math/rand" ) func add(x int, y int) int { return x + y } func main() { fmt.Println("My favorite number is", rand.Intn(10)) fmt.Println(add(42, 13)) } 包:每个 Go 程序都是由包(package)组成的,程序运行的入口是包 main 。 导入:这个代码用圆括号组合了导入,这是“打包”导入语句。同样可以编写多个导入语句,例如: import "fmt" import "math" 这个程序使用并导入了包 "fmt" 和" math/rand" 。包名与导入路径的最后一个目录一致。例如,如果你导入了" math/rand" ,那么你就可以在程序里面直接写rand.Intn(10),但如果你导入的是" math" ,那么你就得写math.rand.Intn(10)。 函数:函数可以没有参数或接受多个参数。在这个例子中, add 接受两个 int 类型的参数,注意类型在变量名之后。有没有觉得很奇怪呢,下面就详细解释一下go这样做的原因。 看一个c的例子: int (*fp)(int

基础-内存

不问归期 提交于 2020-01-13 00:53:34
什么是内存 内存(Memory)是计算机中最重要的部件之一,它是程序与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存对计算机的影响非常大,内存又被称为 主存 ,其作用是存放 CPU 中的运算数据,以及与硬盘等外部存储设备交换的数据。只要计算机在运行中,CPU 就会把需要运算的数据调到主存中进行运算,当运算完成后CPU再将结果传送出来,主存的运行也决定了计算机的稳定运行。 内存的物理结构 在了解一个事物之前,你首先得先需要 见 过它,你才会有印象,才会有想要了解的兴趣,所以我们首先需要先看一下什么是内存以及它的物理结构是怎样的。 内存的内部是由各种IC电路组成的,它的种类很庞大,但是其主要分为三种存储器 随机存储器(RAM):内存中最重要的一种,表示既可以从中读取数据,也可以写入数据。当机器关闭时,内存中的信息会 丢失 。 只读存储器(ROM):ROM 一般只能用于数据的读取,不能写入数据,但是当机器停电时,这些数据不会丢失。 高速缓存(Cache):Cache 也是我们经常见到的,它分为一级缓存(L1 Cache)、二级缓存(L2 Cache)、三级缓存(L3 Cache)这些数据,它位于内存和 CPU 之间,是一个读写速度比内存 更快 的存储器。当 CPU 向内存写入数据时,这些数据也会被写入高速缓存中。当 CPU 需要读取数据时

C语言基础:指针

旧街凉风 提交于 2020-01-12 18:10:52
【指针】 一、指针变量与定义 C语言有两种变量:其中变量(普通变量)存储内容值;地址变量(指针变量)存储地址值。 1、定义格式 类型名 *指针变量名;*是指针变量的标志,不包含在变量名里 注: (1)定义变量(普通变量、指针变量)都必须在前面有类型名。前类型后分号为定义语句。除此之外,其它语句都是执行语句。 (2)在定义指针变量时,指针变量名前的 * 表示现定义的是一个指针类型变量。星号并不是指针变量名的一总分,只是一个标志。 (3)指针变量专门用来存地址,禁止将一个整型直接赋给一个指针变量。 2、指针变量的引用 “&”取地址运算符,通过&运算符可以取出普通变量的地址。 “*”指针运算符,*可以取出指针变量所指向的普通变量的值(间接引用普通变量)。功能是 *地址 -》 取出内容值。 “&”“*”是单目运算符,优先级2级,方向从右向左 指针变量运算方法:(口诀四)地址变量得地址,得谁地址指向谁, 有*为内容值,不是读就是写,*在赋值号左边为写,其它都为读。无*为地址值,地址赋值意味着改指向。 注: (1)可以通过赋值使一个指针变量“指向”某一普通变量(指针变量=&普通变量)。 指针变量必须定义且初始化后再使用。 (2)在C语言中正确的做法是先让指针变量指向一个确定的存储单元后,再通过该指针变量引用它所指向的存储单元。 (3)变量名(普通变量、指针变量)都表示其存储单元内的值。 (4

2019年春季学期第六周作业

淺唱寂寞╮ 提交于 2020-01-12 14:27:54
A Q 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 2019春第六周作业 我在这个课程的目标是 尽可能了解并且应用指针及文件和数组的知识 这个作业在那个具体方面帮助我实现目标 大致掌握了数组的简单编程及应用,了了解了文件和指针的基础知识和简单应用 参考文献 C语言chap11 和 C语言chap10 一、本周完成的作业 题目1. 6-1 求两数平方根之和 函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。** 函数定义接口 double fun (double *a, double *b); 其中 a 和 b 是用户传入的参数。函数求 a 指针和 b 指针所指的两个数的平方根之和,并返回和。 裁判测试程序样例: include<stdio.h> include <math.h> double fun (double *a, double b); int main ( ) { double a, b, y; scanf ("%lf%lf", &a, &b ); y=fun(&a, &b); printf ("y=%.2f\n", y ); return 0; } / 请在这里填写答案 */ 输入样例: 12 20 输出样例: y=7.94 1).实验代码 double fun (double *a,

数组指针和指针数组的区别

依然范特西╮ 提交于 2020-01-12 00:19:40
数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针 for(i=0;i<3;i++) p[i]=a

数组指针和指针数组的区别(2)

谁都会走 提交于 2020-01-11 10:07:38
数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针 for(i=0;i<3;i++) p[i]=a

指针数组和数组指针的区别

蹲街弑〆低调 提交于 2020-01-11 05:02:00
数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针 for(i=0;i<3;i++) p[i]=a