當前位置:首頁 » 編程語言 » 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、 兩者都不是原子操作