『壹』 菜鳥求解:如何用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、 兩者都不是原子操作