指针数组

程序员需要了解的硬核知识之内存

佐手、 提交于 2019-12-02 15:22:03
我们都知道,计算机是处理数据的设备,而数据的主要存储位置就是 磁盘 和 内存 ,并且对于程序员来讲,CPU 和内存是我们必须了解的两个物理结构,它是你通向高阶程序员很重要的桥梁,那么本篇文章我们就来介绍一下基本的内存知识。 什么是内存 内存(Memory)是计算机中最重要的部件之一,它是程序与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存对计算机的影响非常大,内存又被称为 主存 ,其作用是存放 CPU 中的运算数据,以及与硬盘等外部存储设备交换的数据。只要计算机在运行中,CPU 就会把需要运算的数据调到主存中进行运算,当运算完成后CPU再将结果传送出来,主存的运行也决定了计算机的稳定运行。 内存的物理结构 在了解一个事物之前,你首先得先需要 见 过它,你才会有印象,才会有想要了解的兴趣,所以我们首先需要先看一下什么是内存以及它的物理结构是怎样的。 内存的内部是由各种IC电路组成的,它的种类很庞大,但是其主要分为三种存储器 随机存储器(RAM): 内存中最重要的一种,表示既可以从中读取数据,也可以写入数据。当机器关闭时,内存中的信息会 丢失 。 只读存储器(ROM):ROM 一般只能用于数据的读取,不能写入数据,但是当机器停电时,这些数据不会丢失。 高速缓存(Cache):Cache 也是我们经常见到的,它分为一级缓存(L1 Cache)、二级缓存(L2

程序员需要了解的硬核知识之内存

你说的曾经没有我的故事 提交于 2019-12-02 15:18:59
我们都知道,计算机是处理数据的设备,而数据的主要存储位置就是 磁盘 和 内存 ,并且对于程序员来讲,CPU 和内存是我们必须了解的两个物理结构,它是你通向高阶程序员很重要的桥梁,那么本篇文章我们就来介绍一下基本的内存知识。 什么是内存 内存(Memory)是计算机中最重要的部件之一,它是程序与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存对计算机的影响非常大,内存又被称为 主存 ,其作用是存放 CPU 中的运算数据,以及与硬盘等外部存储设备交换的数据。只要计算机在运行中,CPU 就会把需要运算的数据调到主存中进行运算,当运算完成后CPU再将结果传送出来,主存的运行也决定了计算机的稳定运行。 内存的物理结构 在了解一个事物之前,你首先得先需要 见 过它,你才会有印象,才会有想要了解的兴趣,所以我们首先需要先看一下什么是内存以及它的物理结构是怎样的。 内存的内部是由各种IC电路组成的,它的种类很庞大,但是其主要分为三种存储器 随机存储器(RAM): 内存中最重要的一种,表示既可以从中读取数据,也可以写入数据。当机器关闭时,内存中的信息会 丢失 。 只读存储器(ROM):ROM 一般只能用于数据的读取,不能写入数据,但是当机器停电时,这些数据不会丢失。 高速缓存(Cache):Cache 也是我们经常见到的,它分为一级缓存(L1 Cache)、二级缓存(L2

二维数组的含义

淺唱寂寞╮ 提交于 2019-12-02 14:40:19
**总结:**二维数组数组名不是二级指针,而是一个指向数组的指针,简称数组指针。 int(* p)[4]:数组指针,指向数组的指针; int *p[4]:长度为4,每个元素都是指针的数组,简称指针数组。 来源: https://blog.csdn.net/qq_44915016/article/details/102774679

C语言数组和指针的关系

大城市里の小女人 提交于 2019-12-02 14:39:27
案例: int matrix[3][10]; matrix[1][5] matrix: 指向包含10个整型元素的数组的指针, 指代第一行, 第一行是子数组 matrix+1: 指向包含10个整型元素的数组的指针+1表示第二行, 第二行是子数组 *(matrix+1): 对matrix+1进行间接访问操作, 选择第二行的子数组 *(matrix+1)+5: 这个指针比*(matrix+1)子数组上移动5个 *(*(matrix+1)+5) 和*(matrix[1]+5)相同, 对*(matrix+1)+5进行简介访问操作 ----------------------------------------------------------------------------------------- 源码: 1 #include<stdio.h> 2 3 int main() 4 { 5 int a[4][4]= 6 { 7 1, 2, 3, 4, 8 5, 6, 7 ,8, 9 9, 10, 11, 12, 10 13, 14, 15, 16 11 }; 12 int (*ps)[4]=a; 13 14 15 printf("\nps==%x\n", ps); 16 printf("\nps+1==%x\n", ps+1); 17 printf("\nps+2==%x\n", ps

二维字符数组和指针的相应问题研究

人走茶凉 提交于 2019-12-02 14:31:50
二维字符数组和指针的相应问题研究 在尝试用C语言实现广度优先算法时,需要用到支持以二维字符数组为值的哈希表,于是我对自己前面实现的int型键值对的哈希表进行再加工,发现在定义二维字符数组和指针时遇到较大问题,特此记录 shadowfish 2019/10/24 将已知的二维字符数组传入以储存 尝试 一开始,我将待传入的二维字符数组定义为 char a[][30]={"ABCD","EFDG","12122"}; 此代码创建了char类型3行30列 (3个字符串,每个字符串30个字节) 的二维数组。 接着,我尝试用一个二级指针指向它 char **ap =a; 并读取它的第一行字符串 printf("%s",*ap); 编译,运行到 printf("%s",*ap); 时报错 Segmentation fault ,即 段错误 ,访问了 不可访问 的内存。 原因 *ap 的值类型为 char* (指向char的指针) ,而它实际存储的是 char 型二维数组 a 的第一行数据的值 (本质是int型数据) ,而不是指向 a 的第一行数据的首地址。这就导致程序将 int 型数据当作地址访问,自然访问了 不可访问 的内存。 补充 char* p; 字符指针 p 相当于一维字符数组 名 , printf("%s",p) 中 p 指向字符数组首地址,配合 "%s"

数据结构笔记1(c++)_指针

匆匆过客 提交于 2019-12-02 12:59:35
一、数据结构概述 1.定义:     我们如何把现实中大量而复杂的问题,以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作。这个相应的操作也叫算法。   数据结构 =个体 + 个体的关系   算法(狭义) = 对存储数据的操作   2.算法:解题的方法和步骤   2.1.衡量算法好坏的标准:       2.1.1.时间复杂度: 程序 大概 执行的次数,而非执行的时间       2.1.2.空间复杂度: 算法执行过程中大概所占用的最大内存       2.1.3.难易程度(编算法最重要的)       2.1.4.健壮性 3.数据结构的地位:数据结构是软件中最核心的课程    程序 = 数据的存储 + 数据的操作 + 可以被计算机执行的语言 二、预备知识   1.指针     1.1.指针的重要性:指针是c语言的灵魂     1.2.有关指针概念的定义:       指针就是地址 地址就是指针,指针和地址是一个概念       指针变量 是存放内存单元地址的变量, 所谓内存单元地址 即为内存单元编号,两者是一个概念       指针的本质 是一个操作受限的非负整数/从0开始的非负整数                    范围:0 -- FFFFFFFF【4G-1】     

KMP算法---私人笔记

送分小仙女□ 提交于 2019-12-02 11:37:38
  先给出模式匹配问题:给出两个字符穿,一个为S(主串)另一个为T(字串),模式匹配就是求T在S中的位置。我们先介绍简单的模式匹配算法,KMP算法是基于这种算法的改进算法。   简单的模式匹配算法:从S的第一个字符开始和T的第一个字符进行比较,若相等,则继续逐个的比较后续的字符,直到T中的每个字符依次和S中的一个连续的字符序列相等,则匹配成功,返回这个S中的连续字符序列的第一个字符的下标,如果在比较过程中有某个字符不相等,则从S 的下一个字符开始重新和T的第一个字符比较,依此类推,直到S中的字符都比较完了仍然没有匹配成功的话,则匹配不成功。Python实现代码如下: def StrMatching(S,T): i,j=0,0 m,n=len(S),len(T) while i<m and j<n: if S[i]==T[j]: i+=1 j+=1 else: i=i-j+1 j=0 if j==n: return i-n   else: return 0   KMP算法:   接下来进入我们的正餐KMP算法,上述的简单的模式匹配算法的最坏的时间复杂度为O(n*m),KMP算法可以在(m+n)的时间数量级上完成模式匹配操作。KMP算法的改进在于:每当一趟匹配过程中出现字符不相等时,不需要回溯i指针,而是利用已经得到的"部分匹配"的结果将模式串T向右"滑动"尽可能远的一段距离后

C++常见面试题(一)

与世无争的帅哥 提交于 2019-12-02 11:12:28
C++和C的区别 设计思想上: C++是面向对象的语言,而C是面向过程的结构化编程语言 语法上: C++具有封装、继承和多态三种特性 C++相比C,增加了许多类型安全的功能,比如强制类型转换 C++支持范式编程,比如模板类、函数模板等 C++中指针和引用的区别 指针有自己的一块空间,而引用只是一个别名 使用sizeof计算一个指针的大小为4,而引用则是被引用对象的大小 指针可以初始化为空,而引用必须被初始化且必须是一个已有对象的引用 作为参数传递时,指针需要被解引用才可以对对象进行操作,而对引用的修改都会直接改变引用所指的对象 可以有const指针,但没有const引用 指针可以指向其他对象,但引用只能是一个对象的引用,不能被改变 如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄漏 指针和数组的区别 数组:数组用于存储多个相同类型数据的集合,地址是连续的 指针:指针相当于一个变量,存放的是内存中的地址 区别: • 赋值:同类型指针变量可以相互赋值,数组不行,只能一个一个元素的赋值或拷贝 • 存储方式:数组:数组在内存中是连续存放的,开辟一块连续的内存空间。数组是根据数组的下进行访问的,多维数组在内存中是按照一维数组存储的,只是在逻辑上是多维的。指针:指针很灵活,它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。 • 求sizeof

ARTS第九周

旧巷老猫 提交于 2019-12-02 09:38:47
1.Algorithm:每周至少做一个 leetcode 的算法题 2.Review:阅读并点评至少一篇英文技术文章 3.Tip:学习至少一个技术技巧 4.Share:分享一篇有观点和思考的技术文章 以下是各项的情况: Algorithm 链接: [LeetCode-19]-remove-nth-node-from-end-of-list 题意: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 分析: 用快慢指针,快指针先移 n 个节点。 一起移动,两指针之间一直保持 n 个节点,当快指针到链表底了,操作慢指针,删除要删除的元素 时间复杂度:O(n)O(n) class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { if (head == null || n < 1) return head; // 给个负数 万一出错好排查,因为list一般给的正的 ListNode r = new ListNode(-1); r.next = head; ListNode slow = r; // 慢指针 // 快指针 ListNode fast = r; for (int i = 0; i < n; i++) { fast =

php数组指针函数

丶灬走出姿态 提交于 2019-12-01 23:46:38
数组指针函数有reset(),prev(),current(),next(),end(),key(),each() 其中reset(),prev(),current(),next(),end(),都是只与数组的值有关的函数,key()只与数组键,有关的函数,each()可以获得数组的值和键 reset()函数,参数是一个数组,引用传值,将一个数组的内部指针重置到首位,也就是数组的第一个元素所在的位置,然后返回第一个元素的值,在数组为空的情况下返回false 1 $arr = [ 1, 2 ]; 2 var_dump( reset( $arr ) ); 3 $arr = [ ]; 4 var_dump( reset( $arr ) ); 5 // int(1) 6 // bool(false) end()函数,参数是一个数组,引用传值,将一个数组的内部指针移动到数组的最后一个元素所在的位置,然后返回最后一个元素的值,在数组为空的情况下返回false 1 $arr = [ 1, 2 ]; 2 var_dump( end( $arr ) ); 3 $arr = [ ]; 4 var_dump( end( $arr ) ); 5 // int(2) 6 // bool(false) current()函数,参数是一个数组,引用传值,返回当前数组指针所指向的值,指针移动超出了数组的末尾