当前位置:首页 » 编程语言 » c语言实现智能指针
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言实现智能指针

发布时间: 2022-12-20 19:46:28

‘壹’ 菜鸟求解:如何用C#实现c语言 指针的功能呢

C#是完全面向对象的,C语言是面向过程的,虽然他们在语法上有很多类似的东西,但是编程思想完全不一样,你要转化的话需要有OOP思想,如果只是简单的实现一下,那就在statuc
void
Main(大写M)函数中简单弄一下就行了
C#这门语言是不允许(不是完全不允许)使用指针的(出于安全考虑),如果要实现指针的功能,可以用ref关键字进行传递,如果非要用指针,可以在使用指针的代码段加上unsafe标记以跳过编译器的安全检查

‘贰’ C++原生指针,引用与智能指针

c++原生指针来源于c语言,常与取地址运算符 & 搭配使用,基本操作有修改指针指向,解引用操作。常用于获取动态内存分配得到的地址、减少数据拷贝操作(如函数传参)等。

引用是c++有而c没有的语法,引用在语义上是等价于被引用对象,对引用的操作即是对被引用对象内存的操作。引用在底层是指针,但是在行为上与指针不同而与被引用对象相同。如下例:

引用的独特之处在于,引用被定义后,不可更改所指(其行为与被引用对象相同,没有此操作)。

智能指针是c++2.0的新特性之一,其最大的特点在于其结合了指针和对象构造析构的优点RAII,使得其在其生存期结束时可以及时释放其所管理的资源(动态内存分配得到的资源)。常用智能指针有unique_ptr<T>、shared_ptr<T>和weak_ptr<T>。

‘叁’ C语言:指针实现从键盘输入若干数据整数(零表示结束),统计出数据个数,以及最大值、最小值和平均值

#include <stdio.h>
int Input(int s[])
{
int n=0;
scanf("%d",s);
while(*s!=0)
{
n++;s++;
scanf("%d",s);
}
return n;
}
void statistics(int n, int s[], int *max, int *min, float *avg)
{
*max=*min=*s;
*avg=0.0;
for(;*s!=0;s++)
{
if(*s>*max) *max=*s;
else if(*s<*min) *min=*s;
*avg+=*s;
}
*avg/=n;
}
int main(int argc, char *argv[])
{
int s[200],Num,Max,Min,n;
float Avg;
Num=Input(s);
statistics(Num,s,&Max,&Min,&Avg);
printf("Num=%d\nMax=%d\nMin=%d\nAvg=%.3f\n",Num,Max,Min,Avg);
return 0;
}

‘肆’ c/c++(2)

1、全局静态变量、局部静态变量

2、静态函数。只能在 本源文件 中使用

3、c++中,static关键字可以定义 类 中的静态成员变量。类中static静态数据成员拥有一块独立的单独存储区,而不管创建了多少个该类的对象。这些对象共享这一块静态存储区。

4、c++中,static关键字可以定义 类 中的静态成员函数。静态成员函数也是类的一部分,而不是对象的一部分。这些对象共享这一块静态存储区

1、数组是用来存储多个相同类型的集合。数组名是首元素的地址。

2、指针相当一个变量,它存放的是其他变量在内存中地址。指针名只想内存的首地址。

区别:
1、赋值

2、存储方式:

数组:连续存放、连续内存。不是在静态区就是在栈上。

指针:灵活、内存空间不确定。

3、初始化

4、指针操作

数组名的指针操作:

定义:指向函数的指针。

应用:回调

c语言:全局或者静态变量,初始化发生在任何代码执行之前,属于编译期初始化。

c++:全局或者静态对象当且仅当对象首次用到时才进行构造。

解析:

作用域 :C++里作用域可分为6种: 全局 , 局部 , 类,语句 , 命名空间 和 文件作用域 。

静态全局变量 :全局作用域+文件作用域,所以无法在其他文件中使用。

静态局部变量 :局部作用域,只被初始化一次,直到程序结束。

静态局部变量 :局部作用域,只被初始化一次,直到程序结束

生命周期 :静态全局变量、静态局部变量都在静态存储区,直到程序结束才会回收内存。类静态成员变量在静态存储区,当超出类作用域时回收内存。

答:能。

原因: 因为在 编译时对象 就绑定了 函数地址 ,和指针空不空没关系。

定义 : 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

产生原因 : 释放内存后指针不及时置空(野指针),依然指向了该内存,那么可能出现非法访问的错误。这些我们都要注意避免。

避免办法:

1、初始化置为NULL;

2、申请内存判空;

3、指针释放后置空;

4、使用智能指针;

1、首先从作用域考虑 :C++里作用域可分为6种: 全局 , 局部 , 类 , 语句 , 命名空间 和 文件 作用域。

全局变量 :全局作用域,可以通过 extern 作用于其他非 定义的源文件

静态全局变量 :全局作用域+文件作用域,所以 无法在其他 文件中使用。

局部变量 :局部作用域,比如函数的参数,函数内的局部变量等等。

静态局部变量 :局部作用域,只被 初始化一次,直到程序结束

2、从所在空间考虑 :除了 局部变量在栈上 外,其他都在静态存储区。因为静态变量都在静态存储区,所以下次调用函数的时候还是能取到原来的值。

3、生命周期 : 局部变量在栈上,出了作用域就回收内存 ;而全局变量、静态全局变量、静态局部变量都在静 态存储区,直到程序结束才会回收内存。

区别:

1、宏不是函数 ,省去压栈退栈过程,提高效率。 内联函数本质是一个函数 , 并且内联函数本身不能直接调用自身。

2、 宏函数 是在预编译的时候把所有的宏名用宏体来替换,简单的说就是字符串替换。 而内联函数 则是在编译的时候进行代码插入,编译器会在每处调用内联函数的地方直接把内联函数的内容展开,这样可以省去函数的调用的开销,提高效率。

3、 宏定义 是没有类型检查的,无论对还是错都是直接替换; 而内联函数 在编译的时候会进行类型的检查,内联函数满足函数的性质,比如有返回值、参数列表等。

1、赋值顺序不同 :++ i 是先加后赋值;i ++ 是先赋值后加;++i和i++都是分两步完成的。

2、效率不同 :后置++执行速度比前置的慢

3、 i++ 不能作为左值,而++i 可以

4、 两者都不是原子操作