牛客网: C++面试宝典——基础知识(1):指针&引用,cast转换(no),智能指针,几个1,野指针

正在看牛客网上的知识点,又查了写资料,编辑成我好记的样子

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;
}

牛客网: C++面试宝典——基础知识(1):指针&引用,cast转换(no),智能指针,几个1,野指针_第1张图片

这里*p就是解引用

8.指针可以有多级指针(**p),而引用至于一级;

● 说一说c++中四种cast转换

这个看不懂,,,只是记住了四种的名字

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,指针操作超越了作用域

 

你可能感兴趣的:(牛客)