指针数组

程序的机器级表示

有些话、适合烂在心里 提交于 2019-12-01 07:28:24
机器级代码 在计算机中最终执行的都是机器代码,汇编代码、C 语言代码和高级语言的代码都需要转换成机器代码来执行。文章涉及的机器语言主要指 Intel IA32。 如下一段 C 语言代码: 1 int accum = 0; 2 3 int sum(int x, int y) 4 { 5 int t = x +y; 6 accum += t; 7 return ; 8 } 通过 gcc -m32 -O1 -o code.o -c code.c 生成二进制格式的目标代码文件 code.o,通过 hexdump 查看文件内容,在计算机中最终执行的字节指令是: 通过 objdump -d code.o 反汇编查看这段二进制对应的汇编内容: 这里的指令 55 对应了汇编代码 push %ebp,汇编代码非常接近于机器代码,它用可读性更好的文本表示处理器执行的指令。 除了像上面那样通过反汇编目标文件查看对应的汇编代码,还可以通过 gcc 查看 C 编译器产生的汇编代码,如下命令会产生一个汇编文件 code.s 。 # -m32 表示用 32 位模式编译 gcc -O1 -m32 -S code.c 数据格式 虽然 C 语言可以在存储器中声明和分配各种数据类型的对象,但是机器代码只是简单地将存储器看成是一个很大的、按字节寻址的数组。C 语言中的聚合数据类型,例如数组和结构

[总结]数组

℡╲_俬逩灬. 提交于 2019-12-01 07:01:14
数组问题向来是笔试与面试中最长出现的题目。其题型多变,涉及知识面广,从基础到高级数据结构均可涉及,这里总结下刷题常见的以及易错的题型。 常见基础题型 二分 对于数组最常见和基础的算法就是二分了,参考 Rotated Sorted Array问题 ,以旋转数组为例,通过对这类题型的了解,能够很好掌握二分算法的套路与思想。特别注意边界条件以及退出条件的判断,常规二分算法的解法与套路可参考 你真的会写二分查找吗? 另外,对于一些变形题也要特别注意甄别。 [leetcode]275.H-Index II 这里实际要比较的是citations[mid]与n - mid的差别,并进一步二分。具体如下: class Solution: def hIndex(self, citations: List[int]) -> int: if not citations or len(citations) == 0: return 0 n = len(citations) lo ,hi = 0,n-1 while lo <= hi: mid = (lo + hi) // 2 if citations[mid] >= n - mid: hi = mid - 1 else: lo = mid + 1 return n - lo [leetcode]378.Kth Smallest Element in a

C语言强化_day02

我与影子孤独终老i 提交于 2019-11-30 23:51:17
typedef int A[10];//A;数组类型 A b;//int b[10],数组类型变量,普通变量 A *p;//数组类型定义数组指针变量 typedef int (*P)[10];//数组指针类型 P p;//数组指针变量 int (*q)[10];//数组指针变量 一、数组指针和指针数组 指针数组;是一个数组,数组每个元素都是指针 //[]优先级比*高,main函数里面的char *argv[]就是一个指针数组 数组指针;是指向一个数组的指针 (指向一维数组整个数组而不是数组首元素地址) 定义数组指针变量的三种方式 // 1,先定义数组类型,再根据类型定义指针变量。//2,typedef int A[10];//A数组类型 //3,A *p = NULL;//P数组指针类型变量 //4,int a[10],a代表首元素地址,&a代表整个数组首地址(数组指针,数组多长跳多长) 先定义指针数组类型,再根据类型定义变量 //和指针数组写法类似,多了()。()和[]优先级一样,从左到 右。()有指针,他是一个指针,[]。指向数组的指针,它有typedef,所以他是一个数组指针类型。//int a[10],typedef int (*p)[10](10为 步长,需要与数组一致),p q;q = &a; 直接定义数组指针变量 //int (*q)[10]; 来源: https:/

指针加一和数组加一及其内部存储

百般思念 提交于 2019-11-30 22:11:14
数据在内存中的存储是按类型分配空间的,例如:int型变量一般分配四个字节,数据会存储在这四个字节中。同样的;数组的存储也是按照类型来的。 例如:int ar[10] = {1,2,3,};   对于该数组来说,因为是int类型的数组,所以会占用40字节的空间,每4字节存储一个int类型元素。由此引出字符串数组。   对于字符串数组来说,元素是char类型,每个元素占用一个字节。引出指针和字符串数组加一的问题 先看结论:在C中,指针加一指的是增加一个存储单元,对数组而言,这意味着加一后的地址是下一个元素的地址,而不是下一个字节的地址。   解释:存储单元的意思是对应类型的空间,比如int类型的指针,一个存储单元是四字节空间。对于字符串变量,里面的每一个字符都独立占用一个对应类型的存储空间,用指针表示法定义一个字符串变量后,指针++就是下一个元素的地址。而且对于自增这种写法,只有指针表示法可以用。 来源: https://www.cnblogs.com/crine/p/11642450.html

C++数组与指针

主宰稳场 提交于 2019-11-30 19:04:58
不知道在通过前面的内容学习后,是否有很多小伙伴都会认为数组和指针是等价的,数组名表示数组的首地址呢?不幸的是,这是一种非常危险的想法,并不完全正确,前面我们将数组和指针等价起来是为了方便大家理解(在大多数情况下数组名确实可以当做指针使用),不至于被指针难倒,这里就请大家忘记这种观念,因为它可能将会颠覆你之前的认知。 数组和指针不等价的一个典型案例就是求数组的长度,这个时候只能使用数组名,不能使用数组指针,这里不妨再来演示一下: 运行结果: 数组是一系列数据的集合,没有开始和结束标志,p 仅仅是一个指向 int 类型的指针,编译器不知道它指向的是一个整数还是一堆整数,对 p 使用 sizeof 求得的是指针变量本身的长度。也就是说,编译器并没有把 p 和数组关联起来,p 仅仅是一个指针变量,不管它指向哪里,sizeof 求得的永远是它本身所占用的字节数。 站在编译器的角度讲,变量名、数组名都是一种符号,它们最终都要和数据绑定起来。变量名用来指代一份数据,数组名用来指代一组数据(数据集合),它们都是有类型的,以便推断出所指代的数据的长度。 对,数组也有类型,这是很多小伙伴没有意识到的!我们可以将 int、float、char 等理解为基本类型,将数组理解为由基本类型派生得到的稍微复杂一些的类型。sizeof 就是根据符号的类型来计算长度的。 对于数组 a,它的类型是int [6]

夯实Java基础系列19:一文搞懂Java集合类框架,以及常见面试题

牧云@^-^@ 提交于 2019-11-30 19:04:41
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客: www.how2playlife.com 本文参考 https://www.cnblogs.com/chenssy/p/3495238.html 在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影! java中集合大家族的成员实在是太丰富了,有常用的ArrayList、HashMap、HashSet,也有不常用的Stack、Queue,有线程安全的Vector、HashTable,也有线程不安全的LinkedList、TreeMap等等! 上面的图展示了整个集合大家族的成员以及他们之间的关系。下面就上面的各个接口、基类做一些简单的介绍(主要介绍各个集合的特点。区别)。 下面几张图更清晰地介绍了结合类接口间的关系: Collections和Collection。 Arrays和Collections。 Collection的子接口 map的实现类 Collection接口 Collection接口是最基本的集合接口,它不提供直接的实现,Java

C语言——指针数组及实例

匆匆过客 提交于 2019-11-30 12:27:15
数组: ——存储在一块连续的内存空间中 ——数组名就是这块连续内存空间的首地址 指针的算术运算: ——指针的递增和递减(++,-- ) 注意不要加多或者减多了,C语言对这类并不做限制 小结: —————————————————————————————— 实例: 数组逆序: 正常交换 关键在于N要除以2 指针交换的思路: 12 34 56 78 90 一号指针指向第0个元素 二号指针指向最后一个元素 然后1号指针和二号指针交换,交换过后,一号指针++,二号指针-- 直到一号指针和二号指针相差只有一个或者小于等于它的时候 二维数组与指针: 同一维数组,数组名也是数组的首地址 首地址:&a[ 0 ] [ 0 ] 总结: & 取地址 * 根据地址取值 指针不可以赋常量 num[ i ] num[ I ] [ j ] *(num + i ) *(*num + i ) + j //数组名就是数组的首地址 //操作数组 ==》指针 num <==> * ( num + i ) 下面莫名其妙会多出两个图片 =small⚆_⚆ 老九学堂会员社群出品 作者:zero 来源: https://www.cnblogs.com/ljxt/p/11586043.html

指针、数组和结构

只愿长相守 提交于 2019-11-30 06:37:07
指针 对于类型T,T*就是“到T的指针类型”,也就是说,一个类型为T*的变量保存一个类型T的对象地址。例如: char c = 'a'; char *p = &c;  //p保存着c的地址 到数组和函数的指针有更复杂的表示 int *pi;  //到int的指针 char ** char;//到字符的指针的指针 int * ap[15]; //到15个数组的指针 int (*fq)(*char); //到函数的指针,函数以char为参数,返回一个int int *q(*char); //有一个char类型的函数,返回一个到Int的指针 对指针的操作属于间接操作,间接运算符属于(前缀的)一元*。 来源: https://www.cnblogs.com/yanying-fly/p/11570220.html

链表&状态机与多线程

一个人想着一个人 提交于 2019-11-30 06:13:46
《C语言高级专题第9部分-4.9.链表&状态机与多线程》 第一部分、章节目录 4.9.1.链表的引入 4.9.2.单链表的实现 4.9.3.单链表的算法之插入节点 4.9.4.单链表的算法之插入节点续 4.9.5.从链表头部插入新节点 4.9.6.单链表的算法之遍历节点 4.9.7.单链表的算法之删除节点 4.9.8.单链表的算法之逆序 4.9.9.双链表的引入和基本实现 4.9.10.双链表的算法之插入节点 4.9.11.双链表的算法之遍历节点 4.9.12.双链表的算法之删除节点 4.9.13.linux内核链表 4.9.14.内核链表的基本算法和使用简介 4.9.15.什么是状态机 4.9.16.C语言实现简单的状态机 4.9.17.多线程简介 第二部分、章节介绍 4.9.1.链表的引入 本节从数组的缺陷说起引入链表的概念,目的是让大家自然认识到链表的意义和用途。 4.9.2.单链表的实现 本节介绍单链表的思路和编程实现,重点是链表节点的封装和实现。 4.9.3.单链表的算法之插入节点 本节讲述单链表操作的第一个算法,节点插入。主要介绍了头部插入和尾部插入这两种不同算法。 4.9.4.单链表的算法之插入节点续 本节为链表尾部插入的编程实践,带大家写代码实现从尾部插入节点。 4.9.5.从链表头部插入新节点 本节为链表头部插入的编程实践,带大家写代码实现从头部插入节点。 4.9

*p++、(*p)++、*++p、++*p 的区别

安稳与你 提交于 2019-11-30 06:09:22
#include <stdio.h> int main() { int a[5]={1,2,3,4,5}; int *p=&a[3]; //这里p指向数组第四个元素4的起始地址。 *p=100; printf("%d\n",*p++);//先取p指向的值100,再将指针p自增1; printf("%d\n",*p--);// printf("%d\n",*--p);//先将指针p自减1,再取指向的值 return 0; } // 100 5 3 *p++、(*p)++、*++p、++*p 的区别 int a[5]={1,2,3,4,5}; int *p = a;*p++ 先取指针p指向的值(数组第一个元素1),再将指针p自增1; cout << *p++; // 结果为 1 cout <<(*p++); // 1(*p)++ 先去指针p指向的值(数组第一个元素1),再将该值自增1(数组第一个元素变为2 cout << (*p)++; // 1 cout <<((*p)++) //2*++p 先将指针p自增1(此时指向数组第二个元素),* 操作再取出该值 cout << *++p; // 2 cout <<(*++p) //2++*p 先取指针p指向的值(数组第一个元素1),再将该值自增1(数组第一个元素变为2) cout <<++*p; // 2 cout <<(++*p) /