正在看牛客网上的知识点,又查了写资料,编辑成我好记的样子
https://www.nowcoder.com/tutorial/93/a34ed23d58b84da3a707c70371f59c21
● 请说一下C/C++ 中指针和引用的区别?
1.指针有自己的一块空间,指针变量存储的是地址,指向内存的一块存储单元,而引用只是一个别名,对引用的操作与对变量直接操作完全一样;
2.“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
3.指针和引用的自增(++)运算意义不一样;
int a=0;
int &b=a;
int *d=&a;
b++相当于a++, d++后d指向a后面的内存,(*d)++相当于a++
4.引用只能在定义时被初始化一次,之后不可变;指针可变;
5.引用不能为空,指针可以为空;
6.引用没有 const,指针有 const(为了限制指针更改指向,引入了const指针(int* const ptr))
注意:所谓没有const引用指的是顶层const——这部分我也不懂,继续学会,往后补充
7.引用使用时无需解引用(*),指针需要解引用
解引用 "*"的作用是引用指针指向的变量值
#include
int main() {
int a=10;
int* p=&a;
printf("%d\n%d",*p,p);
return 0;
}
这里*p就是解引用
8.指针可以有多级指针(**p),而引用至于一级;
这个看不懂,,,只是记住了四种的名字
1、const_cast
用于将const变量转为非const
2、static_cast
3、dynamic_cast
用于动态类型转换。只能用于含有虚函数的类,用于类层次间的向上和向下转化。只能转指针或引用
向上转换:指的是子类向基类的转换
向下转换:指的是基类向子类的转换
4、reinterpret_cast
几乎什么都可以转,比如将int转指针,可能会出问题,尽量少用
● 给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内,给出思路并手写代码
https://blog.csdn.net/weixin_44289019/article/details/103926481
这位大大解释的非常清楚了,我记录一下代码
#include
#include
using namespace std;
#define ABS_FLOAT 0.0001
struct point{
float x;
float y;
};
float Getarea(const point p1,const point p2,const point p3){
point ab,ac;
ab.x=p2.x-p1.x;
ab.y=p2.y-p1.y;
ac.x=p3.x-p1.x;
ac.y=p3.y-p1.y;
return fabs(ab.x*ac.y-ac.x*ab.y)/2.0f
}
bool judge(const point a,const point b,const point c,const point p){
float s1,s2,s3,s4;
s1=Getarea(a,b,c);
s2=Getarea(a,b,p);
s3=Getarea(a,c,p);
s4=Getarea(b,c,p);
float sum=s2+s3+s4;
if((s1-sum(-ABS_FLOAT))) return true;
else return false;
}
● 请你说一下你理解的c++中的smart pointer四个智能指针: shared_ptr,unique_ptr,weak_ptr,auto_ptr
太菜了,智能指针完全没听说过,,,
智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。
C++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被11弃用。
● 怎么判断一个数是二的倍数,怎么求一个数中有几个1,说一下你的思路并手写代码
二的倍数:a % 2 == 0 或者a & 0x0001 == 0。
几个1:如果是十进制的话按位判断
int func(int n){
int x=n,count=0;
while(x) {
if(x%10==1) count++;
x/=10;
}
return count;
}
如果是二进制的话,n&(n-1)可以消除最低位的1
int func(int n){
int count=0;
while(n) {
n&=n-1;
count++;
}
return count;
}
● 请回答一下数组和指针的区别
指针 | 数组 |
保存数据的地址 | 保存数据 |
间接访问数据,首先获得指针的内容,然后将其作为地址,从该地址中提取数据 | 直接访问数据, |
通常用于动态的数据结构 | 通常用于固定数目且数据类型相同的元素 |
通过Malloc分配内存,free释放内存 | 隐式的分配和删除 |
灵活,可以指向任意类型的数据 | 存储方式:连续内存空间 可以用sizeof取得真实的大小 |
指针变量+1, 不是加一个地址量(即一个字节), 而是加一个内存单元 | 数值+1 |
1.把数组作为参数传递的时候,会退化为指针
2、数组名可作为指针常量
● 请你回答一下野指针是什么?
出现野指针的情况:指针变量的值未被初始化,指针所指向的地址空间已经被free或delete,指针操作超越了作用域