首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏C++

    C语言(指针8

    其中最后一个参数是一种函数指针类型,我们需要自定义一个比较函数将地址传给这个函数指针变量,再通过这个指针调用函数,这个函数就是一个回调函数。 上图为 qsort 函数的使用示例。 = 0; i < sz; i++) { printf("%d ", *((int *)pa + i)); } } void text() { int arr[] = { 5,3,2,7,8,1,0,4,9,6 想要交换就必须对指针进行解引用,解引用的前提又必须对 void * 类型的指针强转类型,但是在不知道类型的情况下这很明显又是一个棘手的问题。 arg2 = *(int*)b; return (arg1 > arg2) - (arg1 < arg2); } int main() { int arr[] = { 5,2,7,4,9,1,0,3,8,6 = *(int*)b; return (arg1 > arg2) - (arg1 < arg2); } void text1() { int arr[] = { 5,2,7,4,9,1,0,3,8,6

    60610编辑于 2024-10-16
  • 来自专栏技术集锦

    练习8指针实现排序

    题目 用指针方法编写一个程序,输入3个整数,将它们按由小到大的顺序输出。 :通过指针间接访问内存,保留地址,可以理解为指针就是一个地址。 同样地,指针就是用于取得地址的,那么这里就有疑问了(Java中没有指针啊?这怎么做?)。 从表面上看,Java的确没有明确给定 “指针” 这个概念。 : (1)避免使用未初始化的指针,多数情况下程序运行错误都与指针未初始化有关,但是由于这种错误不能被编译器检查发现的特殊性,就需要我们格外注意。 (2)因为指针类型给定指针所指向对象的数据类型,所以指针赋值要确保数据类型匹配,才可以对指针进行操作。

    35430编辑于 2022-06-03
  • 来自专栏Gamma安全实验室

    浅淡v8指针压缩

    “详情请参考:https://en.wikipedia.org/wiki/Tagged_pointer” 对于v8中64位的对象指针,它们的高32位基本是不变的,花费4字节来储存它们会浪费内存空间;所以指针压缩将 64位对象指针变为32位,也就是64位指针中的低32位,将64位指针的高32位保存在r13中;访问对象时,只需要将对象指针与根寄存器的基址相加即可得到完整地址。 v8关于指针压缩的实现 首先我们能想到的实现方式是从0地址开始分配4G内存,确保v8对象分配在这4G内存范围内;v8显然没有这样做,在chrome渲染进程中可能会有多个v8实例,这个方案会导致所有v8实例都来竞争这 “详情请参考:https://v8.dev/blog/pointer-compression” 指针压缩在v8漏洞利用中的影响 首先我们很难泄漏v8堆内存空间的高32位(r13寄存器),也就意味着我们用伪造 指针刚好是r13寄存器的高32位,我们可以通过泄露external_pointer来获得v8堆的基址(虽然好像也没有什么用)。

    1.8K20发布于 2020-12-23
  • 来自专栏Java技术栈

    没用 Java 8,怎么优雅地避免空指针

    JDK 8 里面有 Optional ,如果你还在使用 JDK 7 及之前的版本,那么可以使用 Google 的 Guava 库,用法差不多,下面介绍一下 Google 的 Guava 库用法。 相关阅读:避免空指针的 5 个案例! 但相对于底层库来说,在应用级别的代码中,Null往往是导致混乱,疑难问题和模糊语义的元凶,就如同我们举过的Map.get(key)的例子。 JDK8新特性之Optional,这篇推荐看下。 关注微信公众号:Java技术栈,在后台回复:新特性,可以获取我整理的 N 篇最新 Java 新特性教程,都是干货。

    1.1K20发布于 2020-03-20
  • 来自专栏蒙奇D索隆的学习笔记

    计算机初级选手的成长历程——指针8

    进阶指针 导言 大家好,很高兴又和大家见面啦!!! 经过前面的学习,我相信大家对指针、数组这一块的内容已经理解的更加透彻了。在上一篇内容中我们还介绍了函数与指针的结合体——函数指针。 、数组型; 当我们将指针型的元素放入数组时,数组被称为指针数组; 当我们将数组型的元素放入数组时,数组被称为多维数组,如二维数组; 对于上一篇介绍的函数指针来说,它属于指针类型的元素,只不过它的具体类型时函数类型的指针 ,就像字符指针、整型指针一样; 当我们将字符指针类型的元素放入数组时,数组被称为字符指针数组; 当我们将整型指针类型的元素放入数组时,数组被称为整型指针数组; 同理,当我们将函数指针类型的元素放入数组时 就是指针型的函数,指针标志与变量名结合时,就是函数型的指针,我这样应该描述清楚了吧。 17.2 函数指针数组的初始化 经过前面的分析,我们确定了函数指针数组它是一个函数型的指针数组,所以实际上我们是在给指针数组进行初始化。

    35410编辑于 2023-12-18
  • 来自专栏C++

    指针+数组指针+字符指针+指针数组

    指针 指针作为C语言的核心部分,相比较其他的内容相对比较难懂一下,应用的方式多样,变化较多,导致很多的同学非常苦恼,那么接下来,我将陪你来共同揭开指针的神秘面纱; 指针的含义 大家不要把指针想的太难,指针其实就是通过地址找到对应的变量的位置 ,然后我们可以对地址进行解引用来访问变量的内存,来获取值的一种间接方法;我们通常说指针指向哪里哪里,就是指针变量里面存的其他变量(或者常量)的地址;即  指针->地址->内存; 普通变量指针 首先,我们现来看看指针的构成以及表达形式 ; 数组指针 数值指针,其主体是指针,他就是个指针,不过是有点不同而已,这个指针指向的是数组的地址,在此之前我们需要了解数组的地址; 数组的地址; 我们通常说数组的地址是数组名,是数组的首元素地址,也确实是这样 字符指针 含义 字符指针就是指针指向了字符或者字符串,因为字符串可以看成是一个字符数组,所以字符串指针与数组指针大致可以类比; 字符指针打印字符串 这里我使用了三种打印字符串的方式,从结果上看,很明显打出来的字符串都是相同的 指针数组 含义 指针数组,主体是数组,不同的是里面存的是指针,是地址; 指针数组打印二维数组 值得注意的是指针数组的[]前面的*p是没有括号的,我们可以这样看,他是一个数组,数组名是p,数组元素个数是3

    85810编辑于 2024-11-19
  • 来自专栏C++核心编程

    CCPP 指针变量 | 数组指针 | 指针数组 | 野指针 | 空指针

    普通变量和指针变量 共性 PS: 可见这4个函数的汇编指令完全一致,无论是什么类型的指针变量,对指针变量的读写跟普通变量没有任何区别,所谓的指向只是描述指针变量的值时多少而已,就读写而言,指针变量跟普通变量没有任何区别 空指针和野指针指针:定义了一个指针变量,如果没有进行初始化,系统就会有可能随机赋值一个地址给这个指针变量,也就是说,这个指向指向一个未知的区域。 空指针:空指针不是指向常数0,只指向地址0,即NULL,其实换句话说,指针的本质就是地址嘛,空指针就是指针本身的值(地址)为0空指针的作用是防止野指针的出现,因为我们不能知道野指针到底指向哪里,所以我们也无法判断一个指针是否是野指针 指针变量的+-运算 指针变量的加减运算:也就是做地址偏移,不同 的指针类型偏移的步长不同。 图片 图片 PS: 区分指针数组int *a[3]和数组指针int (*a)[3],前者时存放指针的数组,后者是指向数组的指针

    2.5K30编辑于 2023-03-21
  • 来自专栏叶子的开发者社区

    数组指针指针指针

    概念 我们把指向数组的指针叫做数组指针,后面还会学到指针数组,这两个是不一样的,根据中学语文偏正词组的知识可以知道,前者是指针,后者是数组。 注意:二维数组名a不可以赋值给一般指针变量p,只能赋值给二维数组的行指针变量。 行指针变量 行地址和列地址 先看一个代码。 行指针是一种特殊的指针变量,专门指向一维数组。 行指针定义: int a[2][3]; int (*p)[3]; 不可写成 int (*p)[2],因为二维数组a每行有四个元素。 不可写成 int *p[4],此为指针数组的定义。 : p=a[0]; 或: p=*a; 或: p=&a[0][0]; 用法同一般指针变量。

    86010编辑于 2023-07-28
  • 来自专栏C++核心编程

    CCPP 指针变量 | 数组指针 | 指针数组 | 野指针 | 空指针

    普通变量和指针变量 共性 PS: 可见这4个函数的汇编指令完全一致,无论是什么类型的指针变量,对指针变量的读写跟普通变量没有任何区别,所谓的指向只是描述指针变量的值时多少而已,就读写而言,指针变量跟普通变量没有任何区别 空指针和野指针指针:定义了一个指针变量,如果没有进行初始化,系统就会有可能随机赋值一个地址给这个指针变量,也就是说,这个指向指向一个未知的区域。 空指针:空指针不是指向常数0,只指向地址0,即NULL,其实换句话说,指针的本质就是地址嘛,空指针就是指针本身的值(地址)为0空指针的作用是防止野指针的出现,因为我们不能知道野指针到底指向哪里,所以我们也无法判断一个指针是否是野指针 PS: 区分指针数组int *a[3]和数组指针int (*a)[3],前者时存放指针的数组,后者是指向数组的指针。 这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。

    2.5K20编辑于 2022-10-04
  • 来自专栏可涵的从小白到大牛的征程

    指针进阶(1)(字符指针指针数组,数组指针,函数指针

    前言: 本文主要讲解指针进阶部分的内容,分为字符指针指针数组,数组指针,函数指针。 int *arr[5];//存放整型地址的指针数组 char *arr[6];//存放字符类型的指针数组 数组指针 概念辨析 我们类比一下: 整型指针:指向整型变量的指针,存放整型变量的地址的指针。 数组指针:指向数组的指针,存放数组地址的指针。 形式辨析 int * p; 首先*表示这是一个指针,命名为p,然后指向的是int类型的指针,数组指针也一样 int(*p) [5]; 上面的形式就是数组指针,我们需要先用()把*和指针名括起来,然后剩下的就是指针指向的类型 数组接受时,行可以省略,但是列不能 指针接收,必须用数组指针来接收。 函数指针 函数指针就是指向函数的指针

    75210编辑于 2024-10-16
  • 来自专栏叶子的开发者社区

    const 指针 常量指针 指针常量 常量指针常量

    常量指针:指向常量的指针指针定义语句的类型前加const,表示该指针指向一个常量。 const int a=666; const int * p=&a; 常量a只能被访问而不能被改写,但指向常量a的常量指针可以改写。 指针常量 在指针定义语句的指针名前加const,表示该指针是常量。 int a; int * const p=&a; 指针常量在定义时必须初始化,且不允许修改,但其指向的地址的值可以修改,即p不可改写而*p可以改写。 常量指针常量:指向常量的指针常量 在定义时必须初始化。 const int a=666; const int * const p=&a; 很简单,p和*p都不能改写。

    74310编辑于 2023-07-28
  • 来自专栏苦逼的码农

    【链表问题】打卡8:复制含有随机指针节点的链表

    【难度】 尉:★★☆☆ 【解答】 方法一:使用额外的存储空间 这道题的难点在于我们需要定位好随机指针,一个比较简单的解法就是把原节点与复制的节点关联起来,可以使用哈希表把他们关联起来。 = null) { 6 map.put(cur, new Node1(cur.value)); 7 cur = cur.next; 8 } 9 //把副节点连接起来 = null) { 8 next = cur.next; 9 Node1 temp = new Node1(cur.value);//复制节点 10 temp.next cur.rand.next : null; 21 cur = next; 22 } 23 return head.next; 24} 采用这种方法的时候,由于随机节点有可能是空指针 问题拓展 思考:如果是有两个随机指针呢?又该如何处理呢?三个呢?

    67630发布于 2018-12-25
  • 来自专栏学习

    8.《双指针篇》---⑧四数之和(中等偏难)

    5.利用双指针 left 和 right 来充当剩下两个数。 6.去重。类比三数之和。 四数之和其实和三数之和几乎一样。 就是多了层for循环 j 用来充当多余的那个数 方法一:双指针 (类比三数之和) class Solution { public List<List<Integer>> fourSum(int[ List<List<Integer>> ret = new ArrayList<>(); //1.排序 Arrays.sort(nums); //2.利用双指针解决问题 i = 0; i < n; ){ //固定数 //三数之和 for(int j = i+1; j<n; ){ //双指针逻辑

    16200编辑于 2024-11-21
  • 来自专栏走在努力路上的自己

    初识指针指针指针变量、如何理解地址、指针类型的意义、void*指针、野指针、空指针)(笔记)

    指针所指向的内存区: 在函数调用时就会创建一个栈桢,在栈桢中内存被划分为一个一个的单元, 其中每个内存单元能存放8个比特位(一个字节),每个单元也有一个编号。 printf("%p\n", &a);//000000B633B8FBE4 以16进制的形式输出 //只输出起始(低)位置,后面的地址依次加1; //&取出地址操作符 int* pa = ,指针变量并不完全等同指针, 但口头上 指针 一般是 指针变量 2.1指针变量的大小 1.指针变量是专门用来存放地址的,指针变量的大小取决于一个地址存放需要多大空间 32位机器上:地址线32根,地址的二进制序列就是 2.32位平台下地址是32个bit,指针变量的大小是4个字节 64位平台下地址是64个bit,指针变量的大小是8个字节 三、如何理解地址: 计算机中硬件单元要互相协同工作(协同:互相进行数据传递 指针未初始化 2.指针越界访问造成野指针 3.指针指向的空间释放 1.

    1.2K10编辑于 2024-01-26
  • 来自专栏从小白开始修炼

    【C语言】指针进阶:字符指针&&数组指针&&函数指针

    指针数组 数组指针 &数组名 与 数组名 数组指针的使用 数组传参、指针参数 一维数组传参 二维数组传参 一级指针传参 二级指针传参 函数指针 结语 前言 回想之前,我们学了指针的一些基础 指针与结构体 指针的大小是固定的4/8个字节(32位平台/64位平台)。 指针是有类型,指针的类型决定了指针的±整数的步长,指针解引用操作的时候的权限。 指针的运算。 #include <stdio.h> int main() { int arr[10] = {1,2,3,4,5,6,7,8,9,0}; int (*p)[10] = &arr;//把数组 printf("%d ", arr[i][j]); } printf("\n"); } } int main() { int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10 <sz; i++) { printf("%d\n", *(p+i)); } } int main() { int arr[10] = {1,2,3,4,5,6,7,8,9

    4K20编辑于 2022-11-15
  • 来自专栏开发者技术前线

    Java 8 一行代码解决了空指针问题

    JAVA8提供了Optional类来优化这种写法,接下来的正文部分进行详细说明 API介绍 先介绍一下API,与其他文章不同的是,本文采取类比的方式来讲,同时结合源码。 address.getCity(); } } } throw new Excpetion("取值错误"); } JAVA8写法 =null){ dosomething(user); } JAVA8写法 Optional.ofNullable(user) .ifPresent(u->{ dosomething else{ user = new User(); user.setName("zhangsan"); return user; } } java8写法

    65310发布于 2021-10-20
  • 来自专栏米扑专栏

    指针数组与指向指针指针

    指针数组与指向指针指针 http://wlkc.gdqy.edu.cn/jpkc/portal/blob? key=173314 指针数组和数组指针的区别 http://allew.blog.163.com/blog/static/3374389720094148449239/ 指针数组[组图] http:/ /school.cnd8.com/c/jiaocheng/9212.htm 函数指针指针函数 http://lionwq.spaces.eepw.com.cn/articles/article/item am glad to meet you str2: Welcome to study C Welcome to study C ================================= 函数指针 scanf("%d %d", &a, &b); f = max; //给函数指针f赋值,使它指向函数max m = (*f)(a, b); //通过函数指针f调用函数

    3K40发布于 2019-02-19
  • 来自专栏c++与qt学习

    指针,野指针,万能指针

    指针 int * p=NULL; 空指针指向地址编号为0的地址,不可以访问空指针指向的内容,因为内存地址编号0~255之间被系统占用,不可以访问 但是可以printf("%d",p);,输出p指向的地址 野指针 int *p=0xffff; 指针变量指向非法的内存空间,或指针变量为初始化也属于野指针 万能指针 void 无类型指针称为万能指针* 万能体现在:void*可以保存任意数据类型指针的地址 #include<stdio.h> void test() { //万能指针 void* p = NULL; int num = 10; p = # //void *不可以直接解引用, * p2 = NULL; char* p3= NULL; //char类型指针赋值给int类型指针要进行强制类型转换,否则会报错 p2 =(int*)p3; //void*不用强转,也不会发出警告 //因为void*可以保存任意数据类型指针的地址 p1 = p3; } int main() { return 0; }

    1.8K10发布于 2021-03-02
  • 来自专栏学习

    什么是 字符指针? 数组指针? 函数指针? 函数指针数组?

    正文开始 字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 char* ; 一般使用: int main() { char ch = 'w'; char *pc = &ch; *pc 数组指针变量 1. 数组指针变量是什么? 答案是:指针变量 我们已经熟悉: • 整形指针变量: int * pint; 存放的是整形变量的地址,能够指向整形数据的指针。 函数指针变量 什么是函数指针变量呢? 根据前⾯学习整型指针,数组指针的时候,我们的类⽐关系,我们不难得出结论: 函数指针变量应该是⽤来存放函数地址的,未来通过地址能够调⽤函数的。 (int, int) = Add; printf("%d\n", (*pf3)(2, 3)); printf("%d\n", pf3(3, 5)); return 0; } 输出结果: 5 8 、数组指针、函数指针以及函数指针数组都是指针的不同应用形式,它们在C语言中具有重要的地位。

    68410编辑于 2024-10-16
  • 来自专栏京程一灯

    我们是怎样优化 V8 中的指针压缩的

    Chrome 渲染器内存中的 V8 内存消耗百分比 指针压缩(Pointer Compression)是 V8 中为减少内存消耗而进行的多项努力之一。 V8 中的 Value tagging V8 中的 JavaScript 值表示为对象,并在 V8 堆上进行分配,无论它们是对象、数组、数字还是字符串。这使我们可以把任何值都表示为指向对象的指针。 为了避免每次整数递增时都必须分配新的数字对象,V8 使用了众所周知的 pointer tagging 技术在 V8指针中存储额外的或替代数据。 可以通过以下方式将指针调整为 32 位: 确保所有 V8 对象都分配在 4 GB 的内存范围内 将指针表示为该范围内的偏移量 如此严格的限制是不幸的,但是 Chrome 中的 V8 对 V8 堆的大小已经有 为了解决这个问题,我们重用了 V8 实例指针作为减压的基础(请记住堆布局中的 V8 实例数据)。

    1.6K10发布于 2020-04-24
领券