C 語言基礎(6)

2021-09-28 21:01:56 字數 3937 閱讀 7581

在之前幾篇的學習中,學習了多維陣列中的二維陣列,這次進一次補充。

元素為陣列的陣列,每個元素都是乙個新的一維陣列。

通常想象為:不規則的**,由一維陣列組成的陣列 ,

int array=new int[4];//建立具有4個元素的交錯陣列

//建立一堆陣列,賦值給交錯陣列的每個元素

array[0]=new int[3];

array[1]=new int[5];

array[2]=new int[4];

array[3]=new int[1];

//給交錯陣列第乙個陣列的第乙個元素賦值

array[0][0]=1;

讀取交錯陣列的所有資料:foreach的兩層巢狀

用for迴圈時

交錯陣列元素數,理解為行數

for(int r=0;r在方法形參中通過關鍵字paramas定義,方法呼叫者可以傳遞陣列,也可以傳遞一組資料型別相同的變數,甚至可以不傳遞引數。

注意:引數陣列必須在形參列表的最後一位,只能在一維陣列上使用paramas關鍵字,writeline中使用佔位符,就是通過引數陣列實現的。

引數陣列對於方法內部而言就是普通陣列

對於方法外部(呼叫者)而言:可以傳遞陣列

,傳遞一組資料型別相同的變數集合

甚至可以不傳遞引數

作用:簡化呼叫者呼叫方法的** 、

//整數相加方法

//當型別確定 個數不確定的情形

private static int add(paramas int arr)

return sum;

}

//在使用相加方法時就可以寫為:add();

通過型別系統cts(common type system)是.net框架中的乙個組成部分,為所有面向.net框架的語言定義了資料的型別規則。一般分為值型別與引用型別。

值型別:儲存資料本身

引用型別:儲存資料的引用(記憶體位址)

是cpu與其他外部儲存器交換資料的橋梁,用於儲存正在執行的程式與資料,即資料必須載入到記憶體才能被cpu處理,通常開發人員表達的記憶體都是指記憶體條

程式在執行時,clr將申請的記憶體空間從邏輯上進行劃分。

棧區空間小(1m),讀取速度快,用於儲存正在執行的方法,分配的空間叫棧幀。棧幀中儲存方法的引數以及變數等資料,方法執行完畢後,對用的棧幀將被清除。

空間大,讀取速度慢,用於儲存引用型別的資料。

定義在方法內部的變數

特點:沒有預設值,必須自行設定初始值,否則不能使用,方法被呼叫是,存在棧中,方法被呼叫結束是從棧中清除。

因為方法執行在棧中,所以在方法中宣告的變數在棧中

值型別宣告在棧中,資料儲存在棧中

因為值型別直接儲存資料,所以資料儲存在棧中

引用型別

宣告在棧中,資料存數在堆中,棧中儲存該資料的引用。

因為引用型別儲存資料的引用,所以資料在堆中,棧中儲存資料的引用

一些例子

這些記憶體分配畫圖便於理解。

int a=1;

//a在棧中,1在棧中

int arr=new int;

//arr在棧中,1在堆中

arr[0]=1;//修改堆中的資料

arr=new int;//修改棧中的儲存的引用

string s1=「男」;

string s2=「女」;

s1=「女」;//修改的是在棧中儲存的引用

//堆中的文字不能修改

小技巧//沒即改棧中內容

替換引用,方法外不會受到影響

通過引用修改堆中陣列物件

gc(garbage collection)是clr中中針對託管堆自動**釋放記憶體的服務。gc執行緒從棧中的引用開始跟蹤,從而判定哪些記憶體是正在使用的,若gc無法跟蹤到某一塊記憶體,那麼久認為這塊記憶體不再使用了,即為可**的。

定義在類中方法外的變數

特點:具有預設值,所有類被例項化後,存在堆中,物件被**時,成員變數從堆中清除,可以與區域性變數重名。

此中成員變數

值型別:宣告在堆中,資料儲存在堆中,

引用型別:宣告在堆中,資料儲存在堆中的另一塊空間

引數分為三類:值引數,引用引數,輸出引數

值引數值引數:按值傳遞-穿度實參變數儲存的內容

作用:傳遞資訊

引用引數

在引數是引用型別的方法中可以不用返回值

引用引數:按引用傳遞-傳遞實參變數自身的記憶體位址

//使用時前即在前新增ref

方法內部修改引用引數,是指就是修改實參變數

作用:改變資料,

輸出引數

輸出引數:按引用傳遞-傳遞實參變數自身的記憶體位址

//使用時前面加out

區別1:方法內部必須為變數賦值

區別2:輸出引數傳遞之前可以不賦值

作用:返回結果 用於接收方法的結果

tryparse方法,返回兩個結果,out轉換後的結果,返回值是否可以轉換

裝箱//"比較"消耗效能(「最」)

值型別隱式轉換為object型別或由此值型別實現的任何介面型別的過程

內部機制:

1.在堆中開闢記憶體空間

2.在值型別的資料複製到堆中

3.返回堆中新分配物件的位址

int a=1;

object b=a;//裝箱

int c=(int)b;//拆箱

拆箱//"比較"消耗效能

從object型別到值型別或介面型別到實現該介面的值型別的顯示轉換

內部機制:

1.判斷給定型別是否是裝箱型別

2.返回已裝箱例項中屬於原型別欄位的位址

//形參object樂行,實參傳遞值型別,則裝箱

//可以通過過載,泛型避免

int num=100;

strig str=num.tostring();//沒有裝箱

string str02=num+"";//裝箱

//內部實現為:string str02=string.concat("",num);//int==>object

字串常量具備字串池特性

字串常量在建立前,首先在字串池中查詢是否在相同文字,如果存在,則直接返回該物件的引用裡如果不存在,則開闢空間儲存

字串池/目的是提高利用率

字串具有不可變性

字串常量一旦進入記憶體,就不得再次改變沒因為如果在原位置改變會使其他物件記憶體被破壞,導致記憶體洩漏,當遇到字串變數引用新值時,會在記憶體中新建乙個字串,將該字串位址交給該變數引用。

//每次修改,都是重新開闢新的空間儲存資料,替換棧中引用

//此種拼接不可取

string str = 「」;

for (int i = 0; i < 10; i++)

}常用方法

toarray //將字串變為字元陣列

insert //輸入起始索引與需要插入的字元返回乙個新的字串

contains //返回乙個布林值判斷字串是否含有某個字元

tolower/toupper //將字串中所有字元變為小寫(大寫)

indexof //返回乙個所查詢字元在字串第乙個所在位置的索引值

substring //輸入乙個索引,從該索引開始至結尾獲得子字串

trim//刪除字串首部與尾部的空格

split//以指定的字元為間斷點將字串分開

replace //輸入老字元與新字元,將字串中的老字元替換成新字元

join //輸入字串與間斷符,將輸入的字元以間斷符拼接起來成為新的字串,即為join函式的逆過程。

在使用比較運算子比較型別時,對比的是儲存的數值

比較引用型別是,對比的是引用的位址不是資料

本篇的內容較多,較雜,**量較少,但是也是提高**效率,對程式設計加深理解的重要知識點。可能不能一次性全部記住,但是以便以後的查閱,就記錄在這裡。

C語言基礎6

5 程式結構 在c語言程式裡,一共有三種程式結構 順序結構 選擇結構 分支結構 迴圈結構 順序結構 按照實物本身特性,必須乙個接著乙個來完成。選擇結構 到某個節點後,會根據一次判斷結果來決定之後走哪乙個分支。迴圈結構 迴圈結構有乙個迴圈體,迴圈體是一段 對於迴圈結構來說,關鍵在於根據判斷的結果,來決...

C語言基礎知識 6

1.pragma簡介 pragma是編譯器指示字,用於指示編譯器完成一些特定動作。pragma所定義的很多指示字是編譯器和作業系統特有的 pragma在不同的編譯器間是不可移植的 一般用法 pragma parameter 不同的parameter引數語法和意義各不相同。pragma message...

C語言基礎知識歸納(6)

1 定義 陣列是有序的並且具有相同型別的資料的集合。2 特徵 若干 相同型別 長度 有序 3 根據陣列的下標個數的不同可分為 一維 二維 多維 4 按陣列元素的型別不同可分為 數值陣列 字元陣列 指標陣列 結構陣列 1 一般形式 型別符 陣列名 常量表示式 型別符 任一種基本資料型別或構造資料變數 ...