指针

指针和数组计算大小(sizeof()和strlen()的对比)

醉酒当歌 提交于 2020-01-20 01:34:14
/**--------------------------------------------------------------- * @brief 指针和数组变量sizeof()和strlen()的比较 * *---------------------------------------------------------------*/ int point_array_init ( ) { int * PointOne = "123456" ; char * PointTwo = "123456" ; char * PointThree = "123456\0" ; int ArrayOne [ 6 ] = { 1 , 2 , 3 , 4 , 5 , 6 } ; char ArrayTwo [ 6 ] = { 1 , 2 , 3 , 4 , 5 , 6 } ; char ArrayThree [ 7 ] = { 1 , 2 , 3 , 4 , 5 , 6 , '\0' } ; printf ( "\n\t|-------------------------------------------------------------------------\n" ) ; printf ( "\t| int *Point: | " ) ; printf ( "sizeof(Point

c++ ptrdiff_t 类型

戏子无情 提交于 2020-01-20 00:32:54
ptrdiff_t是C/C++标准库中定义的一个与机器相关的 数据类型 。ptrdiff_t类型 变量 通常用来保存两个 指针 减法操作的结果。ptrdiff_t定义在stddef.h(cstddef)这个文件内。ptrdiff_t通常被定义为long int类型。 ptrdiff_t定义在C99标准中。 ptrdiff_t 标准库类型(library type)ptrdiff_t 与 size_t 类型一样, ptrdiff_t 也是一种与机器相关的类型,在 cstddef 头文件中定义。size_t 是unsigned 类型,而 ptrdiff_t 则是 signed 整型 [1] 。 size_t 这两种类型的差别体现了它们各自的用途: size_t 类型用于指明数组长度,它必须是一个正数;ptrdiff_t 类型则应保证足以存放同一数组中两个指针之间的差距,它有可能是负数。 difference_type 是signed类型,表示迭代器差距,vector<int>:: difference_type = iter1-iter2. ptrdiff_t与difference_type区别,前面的是c++定义的标准,后面则是STL定义的 。 int *a=new int(1); int *b=new int(2); ptrdiff_t result=a-b; cout<<a<

剑指offer2.4-算法和数据操作

拟墨画扇 提交于 2020-01-20 00:04:44
题目8 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 思路 题目给出的数组在一定程度上是排序的 ,因此可以使用二分查找法的思路来寻找这个最小的元素。 二分查找一般都设置两个指针P1,P2分别指向数组的第一个元素和最后一个元素,然后通过找到中间元素,比较大小不断缩小指针的指向范围。 我们需要找到的就是递增数组和递减数组的临界点。 1.第一次指向,如果中间元素大于第一个元素,那么说明中间元素位于前半部分递增数组中。可以移动P1指向中间元素的位置 2.如果中间元素小于第一个元素,那么说明中间元素位于后半部分的递减数组中,则移动P2指向中间元素的位置。 3.不断比较P1和P2指针中间元素和P1元素的大小,更新指针指向,直到两个指针指向相邻位置。这样能说明两个指针已经处于数组的临界点了。那么P2指向的元素就是最小元素,P1指向的就是最大元素 4.需要注意考虑出现重复元素的情况,下面的解答没考虑。即当两个指针指向的数字及它们的中间数字三者相等时,就无法判断中间元素处于递增还是递减数组了,无法通过移动指针来缩小范围。就需要通过顺序查找来完成

[转载] 32位汇编指令笔记

守給你的承諾、 提交于 2020-01-19 23:15:54
32位CPU所含有的寄存器有: PQJI~u9te} 4个数据寄存器(EAX、EBX、ECX和EDX) <,\Op=$l3I 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) ']'V?@H]4 6个段寄存器(ES、CS、SS、DS、FS和GS) ZaKT~f%%z 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) f*HEw 1、数据寄存器 s ~ Xa= +D 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。 3Gyw^ {J 32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。 {!]7=K)W9 对低16位数据的存取,不会影响高16位的数据。 COnb@uD 这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。 90rY:!e 4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。 ~bsL W:.’ 程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。 %‘L+y 寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。可用于乘、 除、输入/输出等操作,使用频率很高; E

删除链表元素:哨兵节点

孤者浪人 提交于 2020-01-19 22:58:30
目录 删除链表元素:哨兵节点 83. 删除排序链表中的重复元素Ⅰ 题目描述 代码实现 复杂度分析 203.移除链表元素 题目描述 哨兵节点的利用 代码实现 复杂度分析 82.删除排序链表中的重复元素Ⅱ 题目描述 代码实现 复杂度分析 删除链表元素:哨兵节点 83. 删除排序链表中的重复元素Ⅰ 题目描述 给定一个 排序链表 ,删除所有重复的元素,使得 每个元素只出现一次 。 这是一道标星为简单的题,难度不是很大。需要注意的几点是: 链表已经排好序,这样子的话,寻找重复元素,只要看下一个是否与前一个相等就好了。 还有一点是:删除的元素不会是第一个节点。 代码实现 public static ListNode deleteDuplicates(ListNode head){ //已排序的链表 ListNode currNode = head; //如果后一值和前一值相等,前一值的next指向后一值的next while(currNode!=null&&currNode.next!=null){ if(currNode.val==currNode.next.val){ currNode.next = currNode.next.next; }else{ //不相等的情况,就让前指针向后移 currNode = currNode.next; } } return head; } 复杂度分析

函数指针数组实现计算器和qsort的使用

我只是一个虾纸丫 提交于 2020-01-19 22:40:36
斜体样式 ```c //函数指针数组实现计算器的功能 #include<stdio.h> int add(int x, int y) { return x+y; } int min(int x, int y) { return x-y; } int mul(int x, int y) { return x y; } int div(int x, int y) { return x/y; } // *************************************************** void menu() { printf(“ \n"); printf(" 1.add 2.min \n"); printf(" 3.mul 4.div \n"); printf(“ 5.exit *********************\n”); printf(" **************\n”); } int main() { int rel = 0,input = 0,x,y; int (*pl[5])(int, int)={0,add,min,mul,div};//函数指针数组 do { menu(); printf(“请输入一个数\n”); scanf("%d",&input); if(input>0 && input<=4) { printf(“请输入两个操作数\n”)

循环队列

♀尐吖头ヾ 提交于 2020-01-19 21:51:50
以下说法都是 针对顺序存储结构实现的队列 先理清思路 (1)普通队列的元素满足:存储在数组的前n个单元 这一条件,因此队列元素出列时,由于队列元素都得向前移动,因此需要O(n)时间 (2)为了省去O(n)时间,引入front与rear指针,分别指向队头元素、队尾元素的 下一个位置 。 而rear不是指向队尾元素而是指向其下一个位置的原因是:避免当只有一个元素时, 队头和队尾重合 使处理变麻烦;当遵循上述规则时出现 front = rear,则证明 是空队列而不是只有一个元素 空队列 0 1 2 3 4 5 front rear ↓ ↓ 只有一个元素: 0 1 2 3 4 5 front rear ↓ ↓ a1 (3)但(2)的结构有缺点,因为无需限制队列的元素必须存储在数组的前n个单元的条件,当队列中进行若干进队出队操作后,front、rear指针就会不断后移,直至rear指针越界时,是否说明队列已满,已无可用空间?答案当然是NO!因为 front指针前的数组位置都是可用的 ,这种现象称为 假溢出 0 1 2 3 4 5 front rear ↓ ↓ a3 a4 a5 a6 ? (4)解决假溢出的办法,就是后面满了,再从头开始,即头尾相接的循环。把队列的这种头尾相接的顺序存储结构称为 循环队列 。 至此,循环队列应运而生。 那么问题又来了,按循环队列的规则实现后,(2

关于指针的几个模糊概念

不打扰是莪最后的温柔 提交于 2020-01-19 20:06:38
以上论述仅是个人夜半时分维之遨游,若有不正,请大家批评指正。 总结起来其实就简单的以下5点: ① 指针数组:int (*p)[] ②数组指针:int*p[] ③指针函数: int* fun(char , char) ④函数指针:int(*fun)(char,char) ⑤typedef int (*fun)(char,char): fun为指向某种特定函数类型的指针类型 来源: CSDN 作者: gujiamin-0-1 链接: https://blog.csdn.net/baidu_34263241/article/details/104042709

unix环境高级编程 第七章 进程环境

喜欢而已 提交于 2020-01-19 15:11:59
第七章 进程环境 7.1 引言 本章将学习:程序执行时,main函数时如何让被调用的;命令行参数如何传递给新程序的;典型的存储空间布局是什么样式;如何分配另外的存储空间;进程如何使用环境变量;进程的各种不同终结方式等。另外还将说明longjmp和setjmp函数以及它们与栈的交互作用。 7.2 main函数 当内核执行main函数前,会调用一个特殊的启动例程。连接编辑器设定该启动例程为程序的起始地址。连接编辑器则由C编译器调用。 7.3 进程终止 有8种不同的方式使的进程终止,其中5种为正常终止方式 从main返回; 调用exit; 调用_exit或_Exit; 最后一个线程从启动例程返回; 从最后一个线程调用pthread_exit 三种异常终止方式 调用abort 接到一个信号 最后一个线程对取消请求作出相应 退出函数 三个函数用于正常终止一个程序:_exit和_Exit立刻进入内核,exit则先执行一些清理处理,然后返回内核。 # include <stdlib.h> void exit ( int status ) ; void _Exit ( int status ) ; # include <unistd.h> void _exit ( int status ) ; exit函数总是执行一个标准I/O库的清洗关闭操作:对于所有打开流调用fclose函数

leetcode刷题记第19题解法(python解析)

烈酒焚心 提交于 2020-01-19 13:47:56
leetcode刷题记--> 19题解法(python解析) 题目定义 解题 1. 转为列表,然后再转为链表 2. 使用递归的思路 3. 使用字典存储的方法 4. 使用单指针 5. 使用双指针 实现 题目定义 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的。 进阶: 你能尝试使用一趟扫描实现吗? 来源:力扣(LeetCode) 链接: leetcode_19题 . 解题 本次使用4种方法,在leetcode上还有更多的方法,只能说真牛逼,真聪明。 1. 转为列表,然后再转为链表 先将链表转为列表,然后将列表转换为链表 2. 使用递归的思路 需要自己debug来进行理解 3. 使用字典存储的方法 首先将链表分为不同的节点进行存储,然后一步步的将链表进行替换 4. 使用单指针 定义单指针 先计算出链表的长度 然后通过链表长度减去n 就是要铲除的那个节点的前一个节点 然后循环 5. 使用双指针 定义双指针 先让first指针先走 先走n步 然后再让first和second同时走 当first走到末尾的时候 second也就走到要删除的那个节点的前一个节点 其实就是两者的一个差值 =============