<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
            C語言

            C語言學習趣事:C語言中復雜類型定義

            時間:2025-03-30 22:24:58 C語言 我要投稿
            • 相關推薦

            C語言學習趣事:關于C語言中復雜類型定義

              說到C語言, 很多人都是又愛又恨啊,既感到用C語言給了程序員極大的開放度和自由度,同時又對C語言的靈活性和高難度性。讓我們一起來看看下面這則關于C語言的趣事吧!

            C語言學習趣事:關于C語言中復雜類型定義

              C語言學習趣事:關于C語言中復雜類型定義

              就目前中國教育做法來說吧,估計大部分高校給學生選的入門級語言就是C語言, 然而經過大學幾年的學習,大部分的學生也只能做到寫個“HelloWord” 這樣的代碼。即便是計算機專業的畢業生,在離開學校后,大部分也是對C語言的掌握也只是停留在簡單的應用,更不用說非計算機專業的學生了, 就像我這樣非計算機專業畢業的,到現在也不會用C語言編寫一個具有實際應用意義的程序。

              估計C語言中最難讓人擺平的估計要算是指針了, 不但難以捉摸,同時又非常復雜。尤其是當具有復雜的數據類型定義的時候。

              1、指針

              何謂指針,這個問題估計不需要說明了。從硬件角度來看,指針應該指的是CPU地址總線上呈現的電平狀態的數字化表示,估計大家都知道經典8051中的尋址過程, 通過地址總線選擇需要操作的存儲地址;在8051中我們知道共有16根地址總線, 因此具有2^16方的可尋址空間,就是具有64K的尋址空間。當所有地址總線呈現低電平時選擇的是0000_0000_0000_0000,即0000H的地址;而當地址總線全部呈現高電平狀態則選擇的是1111_1111_1111_1111,即FFFFH的地址。這個同樣適合8086架構下的尋址, 如果用匯編語言編寫程序,就可以直接指定要操作的地址,或者說可以直接尋址地址。

              2、C語言中的指針

              C語言高效的一個原因就在于可以直接對地址進行操作,雖然不如匯編語言那樣的直接,但是相對于其他一些語言例如VB等語言來說,C的指針操作已經非常“高級”了。C語言的發明者真夠神的, 發明了指針這樣難以駕馭的指針,但是C語言中指針的定義則非常的簡單。

              3、C語言中指針類型定義

              定義語法:

              指針指向的`基類型 * 指針標識符

              例如: int * pValue; 這樣就定義了一個可以指向int類型變量的指針,哈哈,還真神奇,這樣就可以控制硬件的連線上的電平了,

              4、指針用法


             

              5、復雜指針定義:

              指針常量和常量指針:

              int const * p; // 定義一個指向常量的指針, 這個指針可以隨意改變指向

              int * const p; //定義一個指針常量, 這個指針只能指向一個變量,并且指向后不能在改變

              const int * const p; //定義一個指向常量的指針常量, 指針變量本身的值不可修改,并且指針指向的變量也不能被修改。

              例如:

              int * const pconst=&test; //這里定義的pconst指針就不能再指向別的整型變量

              const int constvalue=50; //定義一個整型常量, 等價于 int const constvalue

              int const *constvar=&constvalue; //定義一個指向整型常量的指針, 指針指向的變量值不可修改,但是指針指向可以更改

              const int * const constpvar=&constvalue; //定義一個指向整型常量的指針, 指針的指向不可修改。

              這類指針定義的一個簡單的閱讀方法就看: const修飾的是什么, 當其修飾數據類型的時候則定義的是數據類型的變量不能修改;

              當修飾的是指針變量的時候則指針的指向不可改變。

              從上面的實例可以看出: 當沒有指針存在的時候,const 的位置不會影響變量的使用,但是也可以根據其修飾的對象來理解。

              指針數組和數組指針

              int *p[];

              int (*p)[];

              這兩類指針的定義著實非常令人糾結啊, 到底怎么解釋和理解呢? 一團霧水啊...........

              首先看第一個: int *p[ ];

              如上定義: p 的左右各有一個運算符, *和[]; 指針運算符和數組運算符, 在C規范里面, 數組運算符的優先級別高于指針運算符。

              在這里同樣可以利用運算符的優先級來理解這個指針,

              因為[ ]的優先級高于 * ,引起p應該先和[ ]結合,這里就是可以看出,p是一個數組, 然后p再與* 結合,可以看出p是一個指針,最后看數據基類型,p的數據基類型是int型的;綜合上面的描述可以知道: p被定義為一個存儲int型指針的數組。 即p是一個數組,其數組元素的類型是int型指針。

              如果要引用其指向的變量的內容的話,可以這樣使用: int sizex=*p[0]; 這就是指針數組, 就是說數組元素全是指針。

              接下來看第二個:

              int (*p)[];

              同樣可以利用優先級別來理解: ()和[ ]具有相同的優先級, 因此 p 是一個指針, 然后再用 [ ]來修飾p; 則可以看出p將指向一個數組類型數據,這就是說 int (*p)[]是指向int型數組的指針。這個指針不能指向別的數組。

              例如:

              int iArray[4][5];

              int (*pArray)[5];

              pArray=iArray; //這樣可以編譯成功, 因為pArray的類型是 : int (*) [] ; 而 iArray 的類型是 int [4][5]; 可以進行數據類型的轉換

              但是如果:

              pArray=&iArray; //編譯不成功,為什么呢? 因為pArray的類型是 : int (*) [] ; 而&iArray 的類型是 int *[][];很顯然數據類型不一樣

              如果:

              pArray=&iArray[0]; // 編譯成功。

              我們知道在二維數組中, 可以這樣理解:其行元素相當于指針,即 iArray[0]、 iArray[1]、 iArray[2]、iArray[3], 但是其存儲的并不是指針,其存儲的是一個具有5個元素數組的首地址。但是需要這樣才能 iArray=&iArray[0]; (這里二維數組的首地址與 iArray[0] 的地址相同 )。

              對于數組指針的理解,可以將變量去除后然后進行剝離得出其數據類型然后進行理解。例如:

              pArray: int (*)[];

              &iArray[0]: int (*)[ ];

              特殊的引用方式:

              int iArray[4];

              int (*pArray)[4]=NULL; //指定義不初始化同樣可以,但是為了防止出現游離指針,最好用NULL初始化;

              pArray=&iArray; // 這個編譯成功

              指向函數的數組指針

              int (*a[10])(int); // 這個定義一個數組,數組共有10個元素,每個元素存儲一個指向 int (*)(int )函數的指針, 同樣利用優先級來理解。

              指針的指針

            【C語言學習趣事:C語言中復雜類型定義】相關文章:

            C語言中的預編譯宏定義02-26

            簡單講解C語言中宏的定義與使用07-30

            C語言中如何定義函數式宏02-15

            C語言中的整數06-16

            C語言中的字符07-18

            C語言宏定義07-01

            C語言函數的定義07-13

            C語言變量定義07-29

            C語言中各種類型的指針的概念02-14

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院