亚洲一级免费看,特黄特色大片免费观看播放器,777毛片,久久久久国产一区二区三区四区,欧美三级一区二区,国产精品一区二区久久久久,人人澡人人草

C語(yǔ)言

C語(yǔ)言學(xué)習(xí)趣事:C語(yǔ)言中復(fù)雜類(lèi)型定義

時(shí)間:2025-03-30 22:24:58 C語(yǔ)言 我要投稿
  • 相關(guān)推薦

C語(yǔ)言學(xué)習(xí)趣事:關(guān)于C語(yǔ)言中復(fù)雜類(lèi)型定義

  說(shuō)到C語(yǔ)言, 很多人都是又愛(ài)又恨啊,既感到用C語(yǔ)言給了程序員極大的開(kāi)放度和自由度,同時(shí)又對(duì)C語(yǔ)言的靈活性和高難度性。讓我們一起來(lái)看看下面這則關(guān)于C語(yǔ)言的趣事吧!

C語(yǔ)言學(xué)習(xí)趣事:關(guān)于C語(yǔ)言中復(fù)雜類(lèi)型定義

  C語(yǔ)言學(xué)習(xí)趣事:關(guān)于C語(yǔ)言中復(fù)雜類(lèi)型定義

  就目前中國(guó)教育做法來(lái)說(shuō)吧,估計(jì)大部分高校給學(xué)生選的入門(mén)級(jí)語(yǔ)言就是C語(yǔ)言, 然而經(jīng)過(guò)大學(xué)幾年的學(xué)習(xí),大部分的學(xué)生也只能做到寫(xiě)個(gè)“HelloWord” 這樣的代碼。即便是計(jì)算機(jī)專(zhuān)業(yè)的畢業(yè)生,在離開(kāi)學(xué)校后,大部分也是對(duì)C語(yǔ)言的掌握也只是停留在簡(jiǎn)單的應(yīng)用,更不用說(shuō)非計(jì)算機(jī)專(zhuān)業(yè)的學(xué)生了, 就像我這樣非計(jì)算機(jī)專(zhuān)業(yè)畢業(yè)的,到現(xiàn)在也不會(huì)用C語(yǔ)言編寫(xiě)一個(gè)具有實(shí)際應(yīng)用意義的程序。

  估計(jì)C語(yǔ)言中最難讓人擺平的估計(jì)要算是指針了, 不但難以捉摸,同時(shí)又非常復(fù)雜。尤其是當(dāng)具有復(fù)雜的數(shù)據(jù)類(lèi)型定義的時(shí)候。

  1、指針

  何謂指針,這個(gè)問(wèn)題估計(jì)不需要說(shuō)明了。從硬件角度來(lái)看,指針應(yīng)該指的是CPU地址總線上呈現(xiàn)的電平狀態(tài)的數(shù)字化表示,估計(jì)大家都知道經(jīng)典8051中的尋址過(guò)程, 通過(guò)地址總線選擇需要操作的存儲(chǔ)地址;在8051中我們知道共有16根地址總線, 因此具有2^16方的可尋址空間,就是具有64K的尋址空間。當(dāng)所有地址總線呈現(xiàn)低電平時(shí)選擇的是0000_0000_0000_0000,即0000H的地址;而當(dāng)?shù)刂房偩全部呈現(xiàn)高電平狀態(tài)則選擇的是1111_1111_1111_1111,即FFFFH的地址。這個(gè)同樣適合8086架構(gòu)下的尋址, 如果用匯編語(yǔ)言編寫(xiě)程序,就可以直接指定要操作的地址,或者說(shuō)可以直接尋址地址。

  2、C語(yǔ)言中的指針

  C語(yǔ)言高效的一個(gè)原因就在于可以直接對(duì)地址進(jìn)行操作,雖然不如匯編語(yǔ)言那樣的直接,但是相對(duì)于其他一些語(yǔ)言例如VB等語(yǔ)言來(lái)說(shuō),C的指針操作已經(jīng)非常“高級(jí)”了。C語(yǔ)言的發(fā)明者真夠神的, 發(fā)明了指針這樣難以駕馭的指針,但是C語(yǔ)言中指針的定義則非常的簡(jiǎn)單。

  3、C語(yǔ)言中指針類(lèi)型定義

  定義語(yǔ)法:

  指針指向的`基類(lèi)型 * 指針標(biāo)識(shí)符

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

  4、指針用法


 

  5、復(fù)雜指針定義:

  指針常量和常量指針:

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

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

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

  例如:

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

  const int constvalue=50; //定義一個(gè)整型常量, 等價(jià)于 int const constvalue

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

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

  這類(lèi)指針定義的一個(gè)簡(jiǎn)單的閱讀方法就看: const修飾的是什么, 當(dāng)其修飾數(shù)據(jù)類(lèi)型的時(shí)候則定義的是數(shù)據(jù)類(lèi)型的變量不能修改;

  當(dāng)修飾的是指針變量的時(shí)候則指針的指向不可改變。

  從上面的實(shí)例可以看出: 當(dāng)沒(méi)有指針存在的時(shí)候,const 的位置不會(huì)影響變量的使用,但是也可以根據(jù)其修飾的對(duì)象來(lái)理解。

  指針數(shù)組和數(shù)組指針

  int *p[];

  int (*p)[];

  這兩類(lèi)指針的定義著實(shí)非常令人糾結(jié)啊, 到底怎么解釋和理解呢? 一團(tuán)霧水啊...........

  首先看第一個(gè): int *p[ ];

  如上定義: p 的左右各有一個(gè)運(yùn)算符, *和[]; 指針運(yùn)算符和數(shù)組運(yùn)算符, 在C規(guī)范里面, 數(shù)組運(yùn)算符的優(yōu)先級(jí)別高于指針運(yùn)算符。

  在這里同樣可以利用運(yùn)算符的優(yōu)先級(jí)來(lái)理解這個(gè)指針,

  因?yàn)閇 ]的優(yōu)先級(jí)高于 * ,引起p應(yīng)該先和[ ]結(jié)合,這里就是可以看出,p是一個(gè)數(shù)組, 然后p再與* 結(jié)合,可以看出p是一個(gè)指針,最后看數(shù)據(jù)基類(lèi)型,p的數(shù)據(jù)基類(lèi)型是int型的;綜合上面的描述可以知道: p被定義為一個(gè)存儲(chǔ)int型指針的數(shù)組。 即p是一個(gè)數(shù)組,其數(shù)組元素的類(lèi)型是int型指針。

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

  接下來(lái)看第二個(gè):

  int (*p)[];

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

  例如:

  int iArray[4][5];

  int (*pArray)[5];

  pArray=iArray; //這樣可以編譯成功, 因?yàn)閜Array的類(lèi)型是 : int (*) [] ; 而 iArray 的類(lèi)型是 int [4][5]; 可以進(jìn)行數(shù)據(jù)類(lèi)型的轉(zhuǎn)換

  但是如果:

  pArray=&iArray; //編譯不成功,為什么呢? 因?yàn)閜Array的類(lèi)型是 : int (*) [] ; 而&iArray 的類(lèi)型是 int *[][];很顯然數(shù)據(jù)類(lèi)型不一樣

  如果:

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

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

  對(duì)于數(shù)組指針的理解,可以將變量去除后然后進(jìn)行剝離得出其數(shù)據(jù)類(lèi)型然后進(jìn)行理解。例如:

  pArray: int (*)[];

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

  特殊的引用方式:

  int iArray[4];

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

  pArray=&iArray; // 這個(gè)編譯成功

  指向函數(shù)的數(shù)組指針

  int (*a[10])(int); // 這個(gè)定義一個(gè)數(shù)組,數(shù)組共有10個(gè)元素,每個(gè)元素存儲(chǔ)一個(gè)指向 int (*)(int )函數(shù)的指針, 同樣利用優(yōu)先級(jí)來(lái)理解。

  指針的指針

【C語(yǔ)言學(xué)習(xí)趣事:C語(yǔ)言中復(fù)雜類(lèi)型定義】相關(guān)文章:

C語(yǔ)言中的預(yù)編譯宏定義02-26

簡(jiǎn)單講解C語(yǔ)言中宏的定義與使用07-30

C語(yǔ)言中如何定義函數(shù)式宏02-15

C語(yǔ)言中的整數(shù)06-16

C語(yǔ)言中的字符07-18

C語(yǔ)言宏定義07-01

C語(yǔ)言函數(shù)的定義07-13

C語(yǔ)言變量定義07-29

C語(yǔ)言中各種類(lèi)型的指針的概念02-14