指针数组

指针加减法运算的“定义域”

吃可爱长大的小学妹 提交于 2020-03-01 12:21:59
  指针变量加(减)一个整数。   例如:p++,p--,p+i,p-i,p+=i,p-=i等均是指针变量加(减)一个整数。   将该指针变量的原值(是一个地址)和它指向的变量所占用的存储单元的字节数相加(减)。     ————谭浩强 ,《C程序设计》(第四版),清华大学出版社,2010年6月,p290    在C语言中,任何运算都有前提条件。脱离了前提谈运算是荒谬的。   比如,一元“*”运算,其运算对象必须是非void *类型的指针。如果对一个int类型的数据或unsigned类型的数据做一元“*”运算,连编译都无法通过(这也间接说明了指针并非是一个32位无符号整数。参见§246)。   再比如,两个int类型数据相加,其前提条件是结果必须在int类型可以表示的范围之内,否则就成了一种未定义行为(undefined behavior)。   指针运算也是如此。并非所有的指针类型数据都有加(减)法运算。C语言并没有定义void *类型指针或指向函数的指针的加减法运算。换言之,指针的加减法运算只对那些指向数据对象(Object)类型的指针才可能有意义。比如:int *类型的指针可以做加减法运算。   指向数据对象类型的指针的加减法运算并没有限制运算对象是左值(lvalue)或可修改的左值(modifiable lvalue),用一句通俗的话来说

用函数指针实现跳转表与查询跳转表

人盡茶涼 提交于 2020-03-01 06:11:03
编写程序实现如下功能 1、输出如下内容: 命令 0 增加设备 1 删除设备 2 修改设备 3 查询设备 4 监视设备状态 命令(输入相应数字): 2、分别对应5个功能定义5个实现函数,通过判断输入的数字,执行相应的操作; 3、使用函数指针数组实现。 程序设计思路: 实现函数显示输出菜单文字; 按照要求,需要输入0,1,2,3,4数字来执行相应的命令; 因为需要每个数字对应一个功能,而且是以列表的形态出现,所以考虑使用数组来建立一个表; 根据题目,使用数字作为功能索引,而且从数字0开始,所以可以直接创建函数指针数组,然后根据cmd对应的数字,以这个数字为下标,就能取出对应函数的指针。 原理也就是通过使用数组的下标,来跟对应的函数建立联系。 编码实现: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define DIM(x) (sizeof(x)/sizeof(x[0])) 5 6 void display_menu(void);//显示菜单 7 int get_cmd(void); //从终端获取数字指令的输入 8 void run_cmd(int cmd); //执行命令 9 10 /*每条指令对应的执行函数*/ 11 void cmd_add(void); 12 void cmd_del(void); 13 void cmd

Go基础系列:Go slice详解

半腔热情 提交于 2020-02-29 09:24:22
slice表示切片(分片),例如对一个数组进行切片,取出数组中的一部分值。在现代编程语言中,slice(切片)几乎成为一种必备特性,它可以从一个数组(列表)中取出任意长度的子数组(列表),为操作数据结构带来非常大的便利性,如python、perl等都支持对数组的slice操作,甚至perl还支持对hash数据结构的slice。 但Go中的slice和这些语言的slice不太一样,前面所说的语言中,slice是一种切片的操作,切片后返回一个新的数据对象。而Go中的slice不仅仅是一种切片动作, 还是一种数据结构 (就像数组一样)。 slice的存储结构 Go中的slice依赖于数组,它的底层就是数组,所以数组具有的优点,slice都有。且slice支持可以通过append向slice中追加元素,长度不够时会动态扩展,通过再次slice切片,可以得到得到更小的slice结构,可以迭代、遍历等。 实际上slice是这样的结构:先创建一个有特定长度和数据类型的底层数组,然后从这个底层数组中选取一部分元素,返回这些元素组成的集合(或容器),并将slice指向集合中的第一个元素。换句话说, slice自身维护了一个指针属性,指向它底层数组中的某些元素的集合 。 例如,初始化一个slice数据结构: my_slice := make([]int, 3,5) // 输出slice fmt

C++字符串、向量和数组知识概要总结

China☆狼群 提交于 2020-02-28 22:26:07
字符串 记一下string的几种没用过的初始化操作,赋值不能这么搞 string s1("value"); string s2(s1); string s3(6,'z'); string s4=string(6,'a'); 上面没咋提拷贝初始化,带等号的都是拷贝初始化,这里都是直接初始化 getline(cin, line); 可接受句子,遇到换行符则停止, 并且换行符也会被读入,但是这个换行符又被丢弃了 while(getline(cin, line)){ cout << line << endl; } while(cin>>line){ cout << line << endl; } 从上述两个例子里可以看出getline确实读入了换行符而且确实又把它给丢弃了。 注意注意注意!! string.size()这个函数返回的值的类型并不是int,而是string::size_type类型的,并且非常值得注意的是这个类型他是无符号类型的,用这个直接带入一些式子中可能会有意想不到的结果的; 尤其要注意的是s.size()<n这样的结构。~!! 关于string大小的判断,比较第一对相异的字符大小即可,若没有相异的,谁长谁大,或者就是相等 可以用字符字面值和字符串字面值转换成string 当string对象和字符字面值以及字符串字面值混在一起使用是,必须确保加号两边至少一个是string

剑指Offer刷题总结

你。 提交于 2020-02-28 21:50:31
1. 二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路题 从右上角或者左下角开始缩小范围。 2. 替换空格 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 语法题 3. 从尾到头打印链表 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 头插法 数组反转 栈 递归 4. 重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 递归 API:Arrays.copyOfRange() 5. 用两个栈实现队列 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 简单题 6. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5

20180315 代码错题(10)

冷暖自知 提交于 2020-02-28 00:51:47
下列程序的输出结果是() 10,30,60 20,40,60 10,20,30 10,30,50答案 C  错选 A指向数组的指针即为二级指针 n是一个2行3列的数组,p首先指向n的第一个元素 p[0][0]=n[0][0]=10 p[0]为数组第一行首地址,p[0]+1即为&p[0][1],*(p[0]+1)即为n[0][1]=20 p为二级指针,*p为数组第一行首地址即为p[0],(*p)[2]即为p[0][2]=n[0][2]=30 n[][3] 会确定为 n[2][3] 结构, int(*p)[3] 其中p 的含义是,就是指向一个含有3个元素的数组指针 令p=n,即 p=&n[0] 来源: https://www.cnblogs.com/kxzh/p/8576417.html

部分C2教学笔记(数组指针)

旧时模样 提交于 2020-02-27 23:47:17
C2-01数组知识点 一、声明数组 1.元素的概念 2.Int a[10]四部分 Int——数据类型:元素的数据类型 a——数组名: ① 是一个指针常量而不是变量,值为数组的首地址=&a[0] ② 注意重名问题int a;int a[10]不行 charb[5];floatb[10]不行 10——下标: ① 数组的下标表示:数组中元素个数 ② 数组中元素的下标从0开始 []——下标运算符 3.同时声明多个数组 二、数组的赋值 1.赋值符号赋值,数组的初始化: =与{},二者缺一不可。 两个数之间用,隔开 3+1 种形式 3: 完整 :Int a[10]={1,2,3,4,5,6,7,8,9,10}; 省略下标数 :Int a[]={1,2,3,4,5,6,7,8,9,10}; 省略部分元素 :Int a[10]={1,2,3,4,5,6};只给前6个元素赋值,其余元素赋值为0 (注:只有这里这种情况会默认给没有初值的值赋值为0,只做声明int a[10];不会给整个数 组 都给个0作为初值) 1: (其实属于第三种) 均赋值为0时 Int a[10]={0}; (注意:int a[10]={1};并不会都赋值为1,这属于3+1中3的第三种) 2.输入值:利用for循环cin 三、输出:利用for循环 四、Sizeof(数据类型) 不同的计算机和不同的C编译器下各数据类型所占空间不同

C++笔记(3):一些C++的基础知识点

99封情书 提交于 2020-02-26 23:05:08
前言: 找工作需要,最近看了下一些C++的基本概念,为范磊的 《零起点学通C++》,以下是一些笔记。 内容:   delete p;只是删除指针p指向内存区,并不是删除指针p,所以p还是可以用的。删除空指针所指向内存是可以的。   堆中的变量和对象时匿名的,没有名称,只能通过指针来访问。   在堆中创建对象时,在分配内存的同时会调用类的构造函数,在删除堆中对象时,会调用类的析构函数。   为了避免内存泄露,在删除一个指针后应该将其其值赋为0。   常量指针是指针指向的内存区域地址不能改变,但是该内存地址里保存的值是可以改变的,比如int a; int * const p = &a;   指向常量的指针表示指针指向的对象是不能被修改的,但是该指针可以被修改,即该指针可以指向另一块目标内存地址。比如const int a = 0; const int *p = &a; 如果A是一个类,也可以为const A* p = new A;   而指向常量的常指针表示指针本身不能被修改,其指向的内存地址内容也不能被修改。比如const int a = 0; const int * const p = &a;   引用就是别名常量。   堆中的地址是用指针来操作的,用不到别名。   如果在main函数前面的其它函数的声明和定义是一起的,则表明这个函数是内联函数!因此当该函数较长时

C++细节注意点

痴心易碎 提交于 2020-02-25 15:44:44
文章目录 实现和声明的分离 不使用 using namespace std; C++对C语言的增强 重点1 引用 引用的注意事项 引用的本质 指针引用 常量型引用 成员函数调用const修饰对象实例 构造和析构函数实例 拷贝构造函数 拷贝构造函数的调用时机 深拷贝浅拷贝 深拷贝 初始化列表 类对象作为类成员的案例 explicit 关键字 new动态对象创建 完美代替malloc 静态成员变量 静态成员函数 单例模式 成员变量和成员属性分开处理 this指针 this指针的使用 空指针访问成员的函数 常函数和常对象 全局函数做友元函数 整个类做友元类 让成员函数做友元函数 自定义数组实例 运算符重载 二元重载 左移右移的重载的注意点 属性私有后 要使用友元来进行重载 前置后置递增运算符 指针运算符重载(自定义一个智能指针) 赋值运算符重载 [] 运算符的重载 关系运算符重载 函数调用运算符重载 不要重载||和&& 自定义string类 继承 继承方式 继承中的对象模型 继承中的构造和析构顺序 继承中同名成员的处理 继承中静态成员的处理 多继承 菱形继承 解决二义性的方法 虚继承工作原理 多态 静态编联和动态编联 多态原理解析 多态案例1 计算器 抽象类和纯虚基类 虚析构和纯虚析构函数 向上类型转换向下类型转换 游戏多态实例 模板 排序实例 普通函数和函数模板的区别 模板机制内部原理

删除排序数组中的重复项

£可爱£侵袭症+ 提交于 2020-02-24 14:01:29
#目的:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 ##思路:首先可以用两个指针,一个指向前面一个,一个指向后面一个,用一个循环让第二个指针使用全部元素,比较两个指针的元素,若相同就赋值给第一个指针直到循环结束。 class Solution { public : int removeDuplicates ( vector < int > & nums ) { if ( nums . size ( ) == 0 ) return 0 ; int i = 0 ; for ( int j = 1 ; j < nums . size ( ) ; j ++ ) { if ( nums [ i ] != nums [ j ] ) { i ++ ; nums [ i ] = nums [ j ] ; } } return i + 1 ; } } ; 来源: CSDN 作者: Ralo__ 链接: https://blog.csdn.net/weixin_46382378/article/details/104466998