指针

错题集

夙愿已清 提交于 2019-12-30 01:07:11
1.函数strcmp从头至尾顺序地将其对应字符比较,遇到两个字符不等时,两个字符相减得到一个int型值,两个字符串完全相同时,则返回0。 对。我的理解产生了错误。误以为返回值的是ascii码的大小。事实上int大于0则是1,小于则是-1。 2.数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。 错。数组名是地址,不是指针常量,它的值可以赋给指针。 3.有说明语句int a[4][5];,则a[2]+3表示 A 。 A.a数组行下标为2、列下标为3的元素的地址 B.0a数组行下标为2、列下标为3的元素的值 C.a数组第2行的首地址 D.a数组第3行的首地址 a[2]表示地址。+3表示地址后移3个元素 4.语句int *p; *p=50;执行时,不会有任何错误。 错。在执行时,*P没有值。printf不出来任何值。5.对于以下结构定义,++p->str中的++加在 A。 (2分) struct { int len; char *str; } *p; A.指针str上 B.指针p上 C.str指的内容上 D.以上均不是 因为p->str是对指针str的引用。 6.在一个以 h 为头的单向链表中,p 指针指向链尾的条件是(A)。 A.p->next=h B.p->next=NULL C.p->next->next=h D.p->.data=-1 p

26,27删除数组重复项

回眸只為那壹抹淺笑 提交于 2019-12-30 00:11:24
目录 26,27删除数组重复项 题目 双指针法 题26解法 题27解法一 题27解法二 26,27删除数组重复项 题目 题目26 给定一个排序数组,你需要在 原地删除 重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。 题目27 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 示例: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。 刚开始看完题目,不知道应该怎样去解决,为什么不创建新数组就可以“原地”删除元素,在参看力扣优秀解法之后,其实只要返回的新长度的范围内符合即可。 双指针法 题26解法 首先题目是 已经排序后 的数组,在不考虑数组中超出新长度后面的元素的前提下

const与指针

别来无恙 提交于 2019-12-29 21:43:21
# 1 指针指向一个const常量 , 指的是指向的这个常量可以通过指针引用,但是不能通过指针修改,比如传一个数组到函数中,但是又不想被意外地修改其中的数据,那么可以用一个指向这个数组的常量指针来实现。 实例 :int a=20; const int p=a; 这里说明不能使用 p来修改a里面的值,但是 可以直接改变a的值 。 注意 : int a=20; int *p=a;const int *p1=p; 这段代码是被允许的, 可以将非const指针赋值给const指针 ,*p仍然可以修改a的值,但是p1只能引用而不能修改a的值。另外,反过来, 将const指针赋值给非const指针 是不被允许的,因为这样a的值就变成了既可以修改又不可以修改。 这里const表达的指针p是一种不可以改变内容的引用方式, 但是可以修改p的地址 ,新的地址上的内容也是不可以修改的。 # 2 指针指向一个固定的地址 这里指的是指针的内容不可修改,但是指针指向的内容是可以修改的。 实例 :int a=20; int * const p=&a; 这种情况下 p是可以改变a的值的,比如 p=30;但是 p中存放的地址是不可以改的 ,比如有int b=30; p=&b是不被允许的。 # 总结 :const 后面修饰的是不可以改的,const int p 说明 p不可以改变int的内容,int * const

错题题(已更正)

喜夏-厌秋 提交于 2019-12-29 21:30:29
1.函数strcmp从头至尾顺序地将其对应字符比较,遇到两个字符不等时,两个字符相减得到一个int型值,两个字符串完全相同时,则返回0。 对。我的理解产生了错误。误以为返回值的是ascii码的大小。事实上int大于0则是1,小于则是-1。 2.数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。 错。数组名是地址,不是指针常量,它的值可以赋给指针。 3.有说明语句int a[4][5];,则a[2]+3表示 A 。 A.a数组行下标为2、列下标为3的元素的地址 B.0a数组行下标为2、列下标为3的元素的值 C.a数组第2行的首地址 D.a数组第3行的首地址 a[2]表示地址。+3表示地址后移3个元素。 4.语句int *p; *p=50;执行时,不会有任何错误。 错。在执行时,*P没有值。printf不出来任何值。 5.对于以下结构定义,++p->str中的++加在 A。 (2分) struct { int len; char *str; } *p; A.指针str上 B.指针p上 C.str指的内容上 D.以上均不是 因为p->str是对指针str的引用。 6.在一个以 h 为头的单向链表中,p 指针指向链尾的条件是(A)。 A.p->next=h B.p->next=NULL C.p->next->next=h D.p->.data=-1 p

【c】函数指针数组

谁说胖子不能爱 提交于 2019-12-29 13:11:54
部分转自: https://www.cnblogs.com/zmm1996/p/11752882.html 1.函数指针的概念 如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。 函数指针的定义方式为: 函数返回值类型 (* 指针变量名) (函数参数列表); 例如下面语句就定义了一个指向函数的指针变量 p。首先它是一个指针变量,所以要有一个“*”,即(*p);其次前面的 int 表示这个指针变量可以指向返回值类型为 int 型的函数;后面括号中的两个 int 表示这个指针变量可以指向有两个参数且都是 int 型的函数。所以合起来这个语句的意思就是:定义了一个指针变量 p,该指针变量可以指向返回值类型为 int 型,且有两个整型参数的函数。p 的类型为 int(*)(int,int)。 int(*p)(int, int); 2.函数指针用法 demo1: # include <stdio.h> int Max(int, int); //函数声明 int main(void) { int(*p)(int, int); //定义一个函数指针 int a, b, c; p = Max; /

C++ Primer 有感(异常处理)

心已入冬 提交于 2019-12-29 05:23:13
1.异常是通过抛出对象而引发的。 该对象的类型决定应该激活哪个处理代码 。被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个。 2.执行throw的时候, 不会执行跟在 throw 后面的语句,而是将控制从 throw 转移到匹配的 catch ,该 catch 可以是同一函数中局部的 catch ,也可以在直接或间接调用发生异常的函数的另一个函数中。 控制从一个地方传到另一地方,这有两个重要含义: (1)沿着调用链的函数提早退出。 (2)一般而言,在处理异常的时候, 抛出异常的块中的局部存储不存在了。 因为在处理异常的时候会释放局部存储,所以被抛出的对象就不能再局部存储,而是用 throw 表达式初始化一个称为异常对象的特殊对象。 异常对象由编译器管理,而且保证驻留在可能被激活的任意catch都可以访问的空间。这个对象由throw创建,并被初始化为被抛出的表达式的副本。异常对象将传给对应的catch,并且在完全处理了异常之后撤销。(异常对象通过复制被抛出表达式的结果创建,该结果必须是可以复制的类型。) 3.当抛出一个表达式的时候, 被抛出对象的静态编译时类型决定异常对象的类型 。 4.用抛出表达式抛出静态类型时,比较麻烦的一种情况是,在抛出中对指针解引用。对指针解引用的结果是一个对象,其类型与指针的类型匹配。如果指针指向继承层次中的一种类型

C++ Primer 有感(异常处理)

孤街浪徒 提交于 2019-12-29 05:22:52
1.异常是通过抛出对象而引发的。 该对象的类型决定应该激活哪个处理代码 。被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个。 2.执行throw的时候, 不会执行跟在 throw 后面的语句,而是将控制从 throw 转移到匹配的 catch ,该 catch 可以是同一函数中局部的 catch ,也可以在直接或间接调用发生异常的函数的另一个函数中。 控制从一个地方传到另一地方,这有两个重要含义: (1)沿着调用链的函数提早退出。 (2)一般而言,在处理异常的时候, 抛出异常的块中的局部存储不存在了。 因为在处理异常的时候会释放局部存储,所以被抛出的对象就不能再局部存储,而是用 throw 表达式初始化一个称为异常对象的特殊对象。 异常对象由编译器管理,而且保证驻留在可能被激活的任意catch都可以访问的空间。这个对象由throw创建,并被初始化为被抛出的表达式的副本。异常对象将传给对应的catch,并且在完全处理了异常之后撤销。(异常对象通过复制被抛出表达式的结果创建,该结果必须是可以复制的类型。) 3.当抛出一个表达式的时候, 被抛出对象的静态编译时类型决定异常对象的类型 。 4.用抛出表达式抛出静态类型时,比较麻烦的一种情况是,在抛出中对指针解引用。对指针解引用的结果是一个对象,其类型与指针的类型匹配。如果指针指向继承层次中的一种类型

C++异常处理

匆匆过客 提交于 2019-12-29 05:20:51
在C 语言中是没有异常处理机制的,异常处理是C++中的一个对程序运行出错或逻辑出错的一个处理机制,因为C++处理的问题比C语言处理的问题更为复杂,所以不能像C那样,总是假定程序能正常运行,不会发生错误。在C中要想处理程序运行中出现的错误,也只能够用if语句去逐个检查和判断。不幸当发生问题时,程序直接崩溃,没有提供出错信息,让人摸不着头脑。C++中的异常处理使我们能够将问题的检测和问题的解决分离,这样程序的问题检测部分可以不必了解如何处理问题。异常处理中,需要由问题检测部分招聘一个对象给处理代码,通过这个对象的类型和内容,两个部分能够就出现了什么错误进行通信,并向处理外部提供出错信息给用户或在程序中进行错误处理。 一、异常的抛出 1 、异常是通过抛出(throw )对象而引发的,例如,throw runtime_error("Date Error");。被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个。不存在数组或函数类型的异常,如果抛出一个数组,被抛出的对象转换为指向数组首元素的指针,如果抛出一个函数,函数被转换为指向该函数的指针。 2 、执行throw 的时候,不会执行跟在throw后面的语句,而是将控制从throw转移到匹配的catch,抛出的对象不是局部存储,而是用throw表达式初始化一个称为异常对象的特殊对象。抛出的异常通过栈展开,沿嵌套调用链继续向上

C++语言基础(3)-类和对象

心不动则不痛 提交于 2019-12-29 04:50:22
类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数。 一.类的定义 一个简单的类的定义: class Student{ public: //成员变量 char *name; int age; float score; //成员函数 void say(){ cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl; } }; class 是 C++ 中新增的关键字,专门用来定义类。 Student 是类的名称;类名的首字母一般大写,以和其他的标识符区分开。 { } 内部是类所包含的成员变量和成员函数,它们统称为类的成员(Member);由 { } 包围起来的部分有时也称为类体,和函数体的概念类似。 注意:在类定义的最后有一个分号 ; ,它是类定义的一部分,表示类定义结束了,不能省略。 类只是一个模板(Template),编译后 不占用内存空间 ,所以在定义类时不能对成员变量进行初始化,因为 没有地方存储数据 。只有在创建对象以后才会给成员变量分配内存,这个时候就可以赋值了。 二.创建对象并访问类的成员 创建对象的方式如下: #include <iostream> using namespace std; /

C++之类和对象的使用(三)

本秂侑毒 提交于 2019-12-29 04:49:25
   对象数组 如果构造函数只有一个参数,在定义数组时可以直接在等号后面的花括号内提供。Student stud[3]={90,92,01};//合法 如果构造函数有多个参数,则不能用在定义时直接所提供所有实参的方法。 但可以如下定义: //构造函数有三个参数:学号,年龄,成绩 Student stud[3]{ Student(1000,19,22); Student(1001,19,22); Student(1002,19,22); };   对象指针 指向对象的指针 class Box {public: Box(int h=10,int w=10,int len=10); int s; int volume(); private: int height; int width; int length; }; Box::Box(int h,int w,int len) { height=h; width=w; length=len; } int Box::volume(){ return(height*width*length); }Box *ptr;//定义指向对象的指针Box t1;//定义Time类对象ptr=&t1;//将t1的起始地址赋给ptr 指向对象成员的指针 1)指向对象数据成员的指针 定义的一般形式为: 数据类型名 *指针变量名; int *p1; p1=&t1