c語言字符串二維數組的動態分配應,C語言中動態分配二維數組復習過程.doc

C語言中動態分配二維數組復習過程.doc

C語言中動態分配二維數組在C中動態分配內存的,對于單個變量,字符串,一維數組等,都是很容易的。C中動態分配二維數組的方法,很少有C語言書中描述,我查找了有的C語言書中提到了一個方法假定二維數組的維數為MN分配是可以這樣 int ptrnew int*M;這是先動態分配一個包含有M個指針的數組,即指先分配一個針數組/指針數組的首地址保存在ptr中 forint i0;iM;i ptrinew intN;為指針數組的每個元素賦一個地址,這個地址是指向一維數組的地址,也即是為針元數組的每個元素分配一個數組一個源代碼的例子為int pMatrix new int*row;forint i 0; i row; i pMatrixi new intcolumn; forint j 0; j column; j pMatrixij ij; /簡單的初始化 這樣創建一個數組有個嚴重的問題,就是它的內存不連續,行與行之間的內存不連續,雖然可以用ij下標訪問,無法滿足用指向二維數組元素型別的指針變量來訪問整個數組的要求. 例如不能如下訪問每個二維數組元素 int * p NULL;forp pMatrix0; p pMatrix0column * row; p int fff *pme;而這種訪問方式對于真正的二維數組是完全可以的。出現這種原因就是因為行與行之間的內存不連續造成的。所以,這中方式創建的動態二維數組,不是真正意義上的二維數組。那么什么是真正的二維數組呢C語言中的二維數組在內存組織形式是按行存儲的連續的內存區域。所以,必須保證數組元素是按行存儲的,而且也是最重要的是內存要連續。所以,我寫出了如下的一個方法假定二維數組的元素變量類型是MyType;可以是C語言接受的除void之外的任何類型,因為編譯器不曉得void類型的大小;例如int,float,double等等類型;int row 2;/暫假定行數是2,這個可以在運行時刻決定;int column 3;/暫假定列數是2,這個可以在運行時刻決定; void ptdhead NULL;在后面說明為什么要用void類型 void ptdBody NULL;在后面說明為什么要用void類型 ptdhead void mallocsizeofvoid**row sizeofMyType*row*column; ifptdhead return FALSE; ptdBody ptdhead row ; forint ncount 0; ncount row; ncount ptdheadncount ptdBody ncount * column* sizeofMyType/sizeofvoid*; MyTypeptdheadRealse; ptdheadRealse MyTypeptdhead;/強制轉換為自己程序需要的二維數組元素類型的指針 ptdhead NULL; forint i 0; i row; i forint j 0; j column; j ptdheadRealseij ij;進行簡單的初始化; 這樣的一種方法動態分配的二維數組,內存是連續的,是真正意義的C語言二維數組,滿足所有二維數組訪問的方法,而且內存利用效率高,程序性能好。這樣一種分配方法要理解的是一下一點概念體會,只要是指針都可以帶,不管使直接指針,還是間接指針,都可以用下標,只要使指針就可以了,這個很關鍵;另外就是要明白void*的指針是不能夠用于加減法的,因為系統不曉得一個void型的大小,但是void指針卻是可以進行加減法,進行指針偏移的,因為void*型大小使知道的,所以,編譯器使可以計算出偏移地址的。由于void型,系統不曉得大小,所以,void *p void*malloc3; 編譯器無法通過如 void *q p3;我們知道假設一個整型變量nCont在32位機器上是4個字節,q是指向nCont的指針變量,q的值,也就是nCont的地址是0 x00032ec0,那么q1的值為0 x0 x00032ec01*4,這是C語言中計算指針表達式值的方法。即q1的值為q1*sizeofint;從這里,我們可以理解為什么我們用void作為動態分配內存函數返回的類型,因為,如果返回的是void*類型,我們無法計算地址的偏移量,即無法計算出數組首元素的地址,也就是數組的地址。當然,我們可以不用void,可以用除了void*的任何C中內嵌的簡單類型,不過如果考慮使用起來簡單,方便,那么我覺得還是懸著用void,或者char*;選擇char*類型方便的是,char類型的大小是1,那么元素的個數,即等于地址的偏移量。構建實例一維include stdio.h include stdlib.h int main int n1,i; int *array; puts輸入一維長度; scanfd,n1; arrayint*mallocn1*sizeofint;第一維 fori0;in1;i arrayii1; printfdt,arrayi; freearray;釋放第一維指針 return 0; 二維include stdlib.h include stdio.h int main int n1,n2; int array,i,j; puts輸入一維長度; scanfd,n1; puts輸入二維長度; scanfd,n2; arrayintmallocn1*sizeofint*; 第一維 fori0;in1; i arrayiint*mallocn2* sizeofint;第二維 forj0;jn2;j arrayijij1; printfdt,arrayij; puts; fori0;in1;i freearrayi;釋放第二維指針 freearray;釋放第一維指針 return 0; 三維include stdlib.h include stdio.h int main int n1,n2,n3; int *array; int i,j,k; puts輸入一維長度; scanfd,n1; puts輸入二維長度; scanfd,n2; puts輸入三維長度; scanfd,n3; arrayint*mallocn1*sizeofint;第一維 fori0; in1; i arrayiintmallocn2*sizeofint*; 第二維 forj0;jn2;j arrayijint*mallocn3*sizeofint; 第三維 fork0;kn3;k arrayijkijk1;printfdt,arrayijk; puts; puts; fori0;in1;i forj0;jn2;j freearrayij;釋放第三維指針 fori0;in1;i freearrayi;釋放第二維指針 freearray;釋放第一維指針 return 0; 四維include stdlib.h include stdio.h int main int n1,n2,n3,n4; int array; int i,j,k,m; puts輸入一維長度; scanfd,n1; puts輸入二維長度; scanfd,n2; puts輸入三維長度; scanfd,n3; puts輸入四維長度; scanfd,n4; arrayintmallocn1*sizeofint*;第一維fori0; in1; i arrayiint*mallocn2*sizeofint; 第二維 forj0;jn2;j arrayijintmallocn3*sizeofint*; 第三維 fork0;kn3;k arrayijkint*mallocn4*sizeofint;第四維 form0;mn4;m arrayijkmijkm1; printfdt,arrayijkm; puts; puts; puts; fori0;in1;i forj0;jn2;j fork0;kn3;k freearrayijk;釋放第四維指針 fori0;in1;i forj0;jn2;j freearrayij;釋放第三維指針 fori0;in1;i freearrayi;釋放第二維指針 freearray;釋放第一維指針 return 0; 以三維整型數組arrayn1n2n3為例。 先遵循從外層到里層,逐層申請的原則 最外層指針是array,它是個三維指針,所指向的是array,其為二維指針。所以給array(三維指針) 申請內存應 arrayint*callocn1,sizeofint; 次層指針是array,它是個二維指針,所指向的是array,其為一維指針。所以給array(二維指針)申請內存應 fori0;in1;i arrayiintcallocn2,sizeofint*; 最內層指針是array,它是個一維指針,所指向的是array,其是個整型常量。所以給array(一維指針)申請內存應 fori0;in1;i forj0;jn2;j arrayijint*callocn3,sizeofint; array(整型常量) 當然,你可以把它們整合在一起為 int i,j,k; int n1,n2,n3; int *array; scanfddd,n1,n2,n3; arrayint*callocn1,sizeofint; fori0;in1;i arrayiintcallocn2,sizeofint*; forj0;jn2;j arrayijint*callocn3,sizeofint; fork0;kn3;k arrayijkijk1; 最后不要忘了釋放這些內存,這要遵循釋放的時候從里層往外層,逐層釋放的原則。 分析過程可參考上面的解答,這里不再贅述。只給出代碼吧 fori0;in1;i forj0;jn2;j freearrayij;釋放第一維指針 fori0;in1;i freearrayi;釋放第二維指針 freearray;釋放第三維指針 其余維的如四維創建過程大同小異,這里不再贅述。【學習目標】1、積累文中實詞、虛詞和句式知識。 2能夠運用所學的實詞、虛詞及句式方面的知識,去閱讀淺易的文言文。 3情感目標 體會“兼愛”思想內涵,進一步思考其對現代社會的意義。 教學重難點 多義詞義項的歸納和墨子思想的理解、說理方法。【預習案】1、梳理課文中的文言知識。 11、作者介紹墨子,名翟(注音 ),魯人。墨子是我國 時期著名的 、 、科學家、軍事家、社會活動家。 的創始人,并有 一書傳世。他的基本思想主張是 、 、 、尚同、節用、節葬、非樂、天志、明鬼、非命等項,其核心是 。 墨子精通手工技藝,可與當時的巧匠公輸班(俗稱魯班)相比。他自稱是“鄙人”,被人稱為“布衣之士”。墨子曾做過宋國大夫,自詡說“上無君上之事,下無耕農之難”,是一個同情“農與工肆之人”的士人。墨子曾經從師與儒者,學習孔子之術,稱道堯舜大禹,學習詩、書、春秋等儒家典籍。但后來逐漸對儒家繁瑣禮樂感到厭煩,最終舍掉了儒學,形成自己的墨家學派。墨家是一個宣揚仁政的學派。在代表新型地主階級利益的法家崛起以前,墨家是先秦和儒家相對立的最大一個學派,并列“顯學”。墨子的學說思想主要包括以下幾點兼愛非攻。所謂“兼愛”是要求君臣、父子、兄弟都要不分親疏遠近地互相愛,“愛人若愛其身”,并認為社會上出現強執弱、富侮貧、貴傲賤的現象,是因為天下人不相愛所致。天志明鬼。宜揚天命鬼神的迷信思想是墨家的大特點。尚同尚賢。尚同是要求百姓上同于天子。墨子認為,國君是國中賢者,百姓應以君上之是非為是非。他還認為上面了解下情也很重要,因為只有這樣才能賞善罰暴。尚賢是要求君上任用賢者而廢抑不肖者。節用。節用是墨家非常強調的一種觀點,他們抨擊君主、貴族的奢侈浪費,尤其反對儒家看重的久喪厚葬之欲。認為君主、貴族都應像古代大禹一樣,過著極為儉樸的生活。兼愛導學案2、讀準字音并注音家之與家之相篡 ( ) 不憚 ( ) 富必侮貧 ( ) 牂羊之裘 ( )可使毋起者( ) 練帛之冠( )惡人者( ) 蹈火而死者( )朝有黧黑之色( )3、 找出通假字并解釋既以非之( ) 天下之難物于故也 ( ) 昔者楚靈王好士細要 ( ) 教馴其臣 ( ) 破碎亂行 ( ) 貴必敖賤( )辯其故也( )茍君說之( )4、 找出下列句子中的古今異義詞并解釋以不相愛生 夫愛人者者,人亦從而愛之 破碎亂行 5、詞類活用強必執弱,富必侮貧,貴必敖賤,詐必欺愚 利人者,人亦從而利之 脅息然后帶 越王親自鼓其士而進之 越王擊金而退之 是故諸侯不相愛則必野戰以兼相愛、交相利之法易之6 【探究案】1、翻譯下列句子,指出句式特點然則察此害亦何用生哉

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538795.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538795.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538795.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

7.Java常用開發工具

文本編輯器 任意選一款 UltraEdit EditPlus notepad 集成開發環境 IDE:Integrated Development Environment --JBulider (基本淘汰) --Eclipse 普遍使用。https://www.eclipse.org/downloads/ --NetBeans ------------- 更多的Java&a…

python京東商品_Python爬取京東的商品分類與鏈接

前言本文主要的知識點是使用Python的BeautifulSoup進行多層的遍歷。如圖所示。只是一個簡單的哈,不是爬取里面的隱藏的東西。示例代碼from bs4 import BeautifulSoup as bsimport requestsheaders {"host": "www.jd.com","User-Agent&quo…

python加入中小學課程_【python即將進入中學課堂,編程從小抓起,竟然在這幾點上應驗了】- 環球網校...

【摘要】我們都知道,不論是我們使用的app,還是各種各樣的游戲,小程序,都離不開編程軟件的貢獻,其中python占據了半壁江山,隨著大家對python的重視,python即將進入中學課堂,這究竟是好…

用動態規劃算法求解最少硬幣問題 c語言,動態規劃算法求解硬幣找零問題

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓看著這代碼怎么這么熟悉。package 動態規劃找零;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);int change;change scan.nextInt();int[] coins …

git命令行使用

* git branch : 查看本地分支 * git branch -r : 查看遠程分支 * git branch -a : 查看全部分支 * git branch name : 本地新建分支 * git checkout name : 切換到本地 name 分支 * git pull origin name : 從遠程 name 拉取代碼 * git merge name : 合并name * git diff : 查看…

8.對Hello World程序的深入

Welcome.java public class Welcome{public static void main(String[] args){System.out.println("Hello World,I am Java!");}}1、Java對大小寫敏感。如果出現了大小寫拼寫錯誤,程序無法運行。 關鍵字class表明Java程序中的全部內容都包含在類中&…

python整數類型沒有取值范圍限制_詳解Python中6種數據類型

Python中數據類型主要有六種:數字類型,字符串類型,元組類型,列表類型,文件類型和字典類型,我們今天先介紹前四種類型。 假如在Python程序中,出現了“010”,那么這個“010”到底是什么…

bb平臺c語言第2章 習題,C語言各章習題集

C語言習題集第 1 章C語言概述一. 填空題1. C程序是由構成的,一個C程序中至少包含。是C程序的基本單位。2. 任何C程序必須有且只有一個_______函數。3. C程序注釋是由和所界定的文字信息組成的。二. 判斷題1.2.3.4.5. 一個C程序的執行總是從該程序的main函數開始&…

陶晶馳stm32_陶晶馳串口屏學習日記(1)

關于文本控件的key屬性和按鈕控件的注意事項:1 一定加入的是文本控件,把vscope設置成全局才能使用key屬性里的鍵盤。我剛開始用了文本控件設置了key為keybdB,然后又自己弄了個按鈕控件,在彈起事件里寫了page keybdB,在編譯沒錯&am…

failed to keep to the max pss of 66560

錯誤警報D/ModuleListener: ModuleListener.testFailed(com.google.android.memory.gts.AllAppsMemoryHostTest#testPeakPssOfAllApps, java.lang.AssertionError: com.google.android.youtube81073, failed to keep to the max pss of 66560 at org.junit.Assert.fail(Assert.…

9.關于Unicode字符集

原文鏈接:http://blog.csdn.net/yang3wei/article/details/47414483 點擊閱讀原文 ------------------------------------- 1)Java 中 char 占兩個字節,既可以表示中文字符,也可以表示英文字符 2)Unicode只是一個編碼…

10.java 關鍵字與保留字

Java 關鍵字列表 (依字母排序 共51組)所有的關鍵字都是小寫。 在IDE中都會顯示不同的顏色: abstract, assert, boolean, break, byte, case, catch, char, class, const, continue, default, do, double, else, enum,extends, final, finally, float, for, if,imple…

python爬蟲的用途_python爬蟲用途

廣告關閉 騰訊云11.11云上盛惠 ,精選熱門產品助力上云,云服務器首年88元起,買的越多返的越多,最高返5000元!專業點來說就是應用多臺機器同時實現爬蟲任務,這多臺機器上的爬蟲,就是稱作分布式爬蟲…

android獲取短信息,從其ID Android獲取短信詳細信息

我想得到短信的細節(數字,正文,來的時間);我只知道短信的身份.我可以使用此ID查詢“content:// sms”并獲取詳細信息嗎?目前,我可以循環查詢每條消息并獲取詳細信息.但是當你必須從1000 sms獲得單次sms細節10次時效率不高…..希望你能理解這個問題.感謝名…

二元函數泰勒公式例題_高等數學期末總復習 DAY 5. 羅爾定理證明題 拉格朗日、柯西中值定理 泰勒公式及麥克勞林公式...

DAY 5.DAY 5.1.羅爾定理2.拉格朗日定理3.柯西中值定理4.泰勒公式及麥克勞林公式1.羅爾定理羅爾定理描述如下:如果 R 上的函數 f(x) 滿足以下條件:(1)在閉區間 [a,b] 上連續,(2)在開區間 (a,b) 內…

Hazelcast發布Jet 0.6版本

\看新聞很累?看技術新聞更累?試試下載InfoQ手機客戶端,每天上下班路上聽新聞,有趣還有料!\\\分布式計算技術和工具開發商Hazelcast正式發布了他們的開源流式處理引擎Jet 0.6。\\Jet自2017年2月起就已可用,而…

11.標識符_unicode和GBK_各種字符集的關系

標識符 作用: 給變量,類和方法命名。 Java標識符命名規則: --必須以字母,下劃線_,美元符$開頭。 --其他部分可以是字母,下劃線,美元符和數字的任意組合。 --Java標識符大小寫敏感&#xf…

python怎么轉到下一行_Python轉到下一行并保存/編輯內容

這個代碼是在以前的帖子中建立的。我正在努力調整它以適應我們的數據。但這不管用。。以下是我們的文件示例:read:1424:2165 TGACCA/1:2165 TGACCA/2 1..100 chr1:3033296..3033395 #just this line 1..100 -chr1:3127494..3127395 1..100 chr1:3740372..3740471 1 …

android應用程序是什么,簡述Android應用程序結構是什么?公共題庫

試題分類:Android簡述Android應用程序結構是什么?解析:Android應用程序結構是:LinuxKernel(Linux內核)、Libraries(系統運行庫或者是c/c核心庫)、ApplicationFramework(開發框架包)、Applications(核心應用程序)以下這些控件可以放置按鈕?答…

《程序設計與數據結構》第八周學習總結

學號 20172326 《程序設計與數據結構》第八周學習總結 教材學習內容總結 后綁定在程序執行時執行多態性可由繼承與接口實現排序有選擇法排序與插入法排序搜索分為線性搜索與二分搜索算法,同一類型的不同方法可能解決同一問題,但是,效率與難以…