欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
深入理解C語(yǔ)言指針-2「轉載」

【【BiliIT】深入理解C語(yǔ)言指針-2「轉載」】https://toutiao.com/group/6743948938002301452/?app=explore_article&timestamp=1570216716&req_id=201910050318350100140470141A94B6C2&group_id=6743948938002301452&tt_from=copy_link&utm_source=copy_link&utm_medium=toutiao_ios&utm_campaign=client_share 



三、指針與數組

3.1、指向數組的指針

如以下語(yǔ)句:

· int nums[10], *p;

上面語(yǔ)句定義了一個(gè)數組 nums,在定義時(shí)分配了 10 個(gè)連續的int 內存空間。而一個(gè)數組的首地址即為數組名nums,或者第一個(gè)元素的首地址也是數組的首地址。那么有兩種方式讓指針變量 p 指向數組 nums:

· //數組名即為數組的首地址

· p = nums;

· //數組第一個(gè)元素的地址也是數組的首地址

· p = &nums[0];

上面兩句是等價(jià)的。

如下幾個(gè)操作,用指針操作數組:

*p = 1,此操作為賦值操作,即將指針指向的存儲空間賦值為 1。此時(shí) p 指向數組 nums 的第一個(gè)元素,則此操作將 nums 第一個(gè)元素賦值為 0,即 nums[0] = 1。

p 1,此操作為指針加整數操作,即向前移動(dòng)一個(gè)單元。此時(shí) p 1 指向 nums[0]的下一個(gè)元素,即 nums[1]。通過(guò)p 整數可以移動(dòng)到想要操作的元素(此整數可以為負數)。

如上面,p(p 0)指向 nums[0]、p 1 指向 nums[1]、、、類(lèi)推可得,p i 指向 nums[i],由此可以準確操作指定位置的元素。

在 p 整數的操作要考慮邊界的問(wèn)題,如一個(gè)數組長(cháng)度為 2,p 3 的意義對于數組操作來(lái)說(shuō)沒(méi)有意義。

下面寫(xiě)一段代碼,用指針訪(fǎng)問(wèn)數組的元素:

· //定義一個(gè)整形數組,并初始化

· int nums[5] = {4, 5, 3, 2, 7};

· //定義一個(gè)指針變量 p,將數組 nums 的首地址賦值給 p,也可以用&p = nums[0]賦值

· int *p = nums, i; //i 作為循環(huán)變量

· //p 指向數組第一個(gè)元素(數組首地址),我們可以直接用間接尋址符,獲取第一個(gè)元素的內容

· printf('nums[0] = %d\n', *p); //輸出結果為 nums[0] = 4

· //我們可以通過(guò)“p 整數”來(lái)移動(dòng)指針,要先移動(dòng)地址,所以 p 1 要擴起來(lái)

· printf('nums[1] = %d\n', *(p 1)); //輸出結果為 nums[1] = 5

· //由上面推導出*(p i) = nums[i],所以我們可以通過(guò) for 循環(huán)變量元素

· for(i = 0; i < 5; i ){

· printf('nums[%d] = %d', i, *(p i));

· }

注:數組名不等價(jià)于指針變量,指針變量可以進(jìn)行 p 和&操作,而這些操作對于數組名是非法的。數組名在編譯時(shí)是確定的,在程序運行期間算一個(gè)常量。

3.2、字符指針與字符數組

在 C 語(yǔ)言中本身沒(méi)有提供字符串數據類(lèi)型,但是可以通過(guò)字符數組和字符指針的方式存儲字符串。

(1)字符數組方式

這個(gè)在前面應該學(xué)習過(guò),這里就不贅述了。

· char word[] = 'zack';

· printf('%s', word);

(2)字符指針?lè )绞?/p>

指針?lè )绞讲僮髯址蛿到M操作字符串類(lèi)似,可以把定義的指針看做是字符數組的數組名。在內存中存儲大致如下,這里為了方便換了個(gè)字符串:

· //除了定義一個(gè)字符數組外,還可以直接定義一個(gè)字符指針存儲字符串

· char *sentence = 'Do not go gentle into that good night!';

· //此時(shí)可以做字符串的操作

· //輸出

· printf('%s', sentence);

· //通過(guò)下標取字符

· printf('%c', sentence[0]);

· //獲取字符串長(cháng)度,其中 strlen 是 string.h 庫中的方法

· printf('%d', strlen(sentence));

注:字符指針?lè )绞絽^別于字符數組方式,字符數組不能通過(guò)數組名自增操作,但是字符指針是指針,可以自增操作。自增自減少會(huì )實(shí)現什么效果大家可以自己嘗試運行一下

下面做個(gè)小練習,利用字符指針將字符數組 sentence 中的內容復制到字符數組 word 中:

· //定義字符數組 sentence 和 word,給 sentence 賦初值

· char sentence[] = 'Do not go gentle into that good night!', word[100];

· //定義字符指針,指向 word

· char *ch = word;

· int i;

· //循環(huán)賦值

· for(i = 0; sentence[i] != '\0'; i ){

· *(ch i) = sentence[i];

· }

· //在當 i 等于 sentence 的長(cháng)度(sentence 的長(cháng)度不包含'\0')時(shí),

· //i 繼續自增,此時(shí)判斷 sentence[0] != '\0'不符合,跳出循環(huán),則 i 比 sentence 長(cháng)度大 1

· *(ch i) = '\0';

· //輸出字符串,因為 ch 指向 word,所以輸出結果是一樣的

· printf('ch = %s, word = %s', ch, word);

注:指針變量必須初始化一個(gè)有效值才能使用

3.3、多級指針及指針數組

(1)多級指針

指針變量作為一個(gè)變量也有自己的存儲地址,而指向指針變量的存儲地址就被稱(chēng)為指針的指針,即二級指針。依次疊加,就形成了多級指針。我們先看看二級指針,它們關(guān)系如下:

其中 p 為一級指針,pp 為二級指針。二級指針定義形式如下:

· 數據類(lèi)型 **二級指針名;

和指針變量的定義類(lèi)似,由于*是右結合的,所以*pp 相當于*(*p)。在本次定義中,二級指針的變量名為 pp,而不是**p。多級指針的定義就是定義時(shí)使用多個(gè)“*”號。下面用一個(gè)小程序給大家舉例:

· //定義普通變量和指針變量

· int *pi, i = 10;

· //定義二級指針變量

· int **ppi;

· //給指針變量賦初值

· pi = &i;

· //給二級指針變量賦初值

· ppi = π

· //我們可以直接用二級指針做普通指針的操作

· //獲取 i 的內容

· printf('i = %d', **ppi);

· //獲取 i 的地址

· printf('i 的地址為%d', *ppi);

注:在初始化二級指針 ppi 時(shí),不能直接 ppi = &&i,因為&i 獲取的是一個(gè)具體的數值,而具體數字是沒(méi)有指針的。

(2)指針數組

指針變量和普通變量一樣,也能組成數組,指針數組的具體定義如下:

· 數據類(lèi)型 *數組名[指針數組長(cháng)度];

下面舉一個(gè)簡(jiǎn)單的例子熟悉指針數組:

· //定義一個(gè)數組

· int nums[5] = {2, 3, 4, 5, 2}, i;

· //定義一個(gè)指針數組

· int *p[5];

· //定義一個(gè)二級指針

· int **pp;

· //循環(huán)給指針數組賦值

· for(i = 0; i < 5; i ){

· p[i] = &nums[i];

· }

· //將指針數組的首地址賦值給 pp,數組 p 的數組名作為 p 的首地址,也作為 p 中第一個(gè)元素的地址。

· //數組存放的內容為普通變量,則數組名為變量的指針;數組存放的內容為指針,則數組名為指針的指針。

· pp = p;

· //利用二級指針 pp 輸出數組元素

· for(i = 0; i < 5; i ){

· //pp == &p[0] == &&nums[0],nums[0] == *p[0] == **pp

· printf('%d', **pp);

·

· //指針變量 整數的操作,即移動(dòng)指針至下一個(gè)單元

· pp ;

· }

3.4、指針與多維數組

講多維數組是個(gè)麻煩的事,因為多維數組和二維數組沒(méi)有本質(zhì)的區別,但是復雜度倒是高了許多。這里我主要還是用二維數組來(lái)舉例,但是還是會(huì )給大家分析多維數組和指針的關(guān)系。

(1)多維數組的地址

先用一個(gè)簡(jiǎn)單的數組來(lái)舉例:

· int nums[2][2] = {

· {1, 2},

· {2, 3}

· };

我們可以從兩個(gè)維度來(lái)分析:

先是第一個(gè)維度,將數組當成一種數據類(lèi)型 x,那么二維數組就可以當成一個(gè)元素為 x 的一維數組。

如上面的例子,將數組看成數據類(lèi)型 x,那么 nums 就有兩個(gè)元素。nums[0]和 nums[1]。

我們取 nums[0]分析。將 nums[0]看做一個(gè)整體,作為一個(gè)名稱(chēng)可以用 x1 替換。則 x1[0]就是 nums[0][0],其值為 1。

我們知道數組名即為數組首地址,上面的二維數組有兩個(gè)維度。首先我們把按照上面 1 來(lái)理解,那么 nums 就是一個(gè)數組,則nums 就作為這個(gè)數組的首地址。第二個(gè)維度還是取 nums[0],我們把 nums[0]作為一個(gè)名稱(chēng),其中有兩個(gè)元素。我們可以嘗試以下語(yǔ)句:

· printf('%d', nums[0]);

此語(yǔ)句的輸出結果為一個(gè)指針,在實(shí)驗過(guò)后,發(fā)現就是 nums[0][0]的地址。即數組第一個(gè)元素的地址。

如果再多一個(gè)維度,我們可以把二維數組看做一種數據類(lèi)型 y,而三維數組就是一個(gè)變量為 y 的一維數組。而數組的地址我們要先確定是在哪個(gè)維度,再將數組某些維度看成一個(gè)整體,作為名稱(chēng),此名稱(chēng)就是該維度的地址(這里有些繞)。

例:

· //假設已初始化,二維數組數據類(lèi)型設為 x,一維數組數據類(lèi)型設為 y

· int nums[2][2][2];

· //此數組首地址為該數組名稱(chēng)

· printf('此數組首地址為%d', nums);

· //此數組可以看做存儲了兩個(gè) x 類(lèi)型元素的一維數組,則 nums[0] = x1 的地址為

· printf('第二個(gè)維度的首地址為%d', nums[0]);

· //而 x1 可以看做存儲了兩個(gè) y 類(lèi)型元素的一維數組,則 y1 = x1[0] = nums[0][0]

· printf('第三個(gè)維度的首地址為%d', nums[0][0]);

三維數組實(shí)際存儲形式如下:

實(shí)際存儲內容的為最內層維度,且為連續的。對于 a 來(lái)說(shuō),其個(gè)跨度為 4 個(gè)單元;對 a[0]來(lái)說(shuō),其跨度為 2 個(gè)單元;對 a[0][0]來(lái)說(shuō),跨度為一個(gè)單元。有上面還可以得出:

· a == a[0] == a[0][0] == &a[0][0][0];

上面的等式只是數值上相等,性質(zhì)不同。

(2)多維數組的指針

在學(xué)習指針與數組的時(shí)候,我們可以如下表示一個(gè)數組:

· int nums[5] = {2, 4, 5, 6, 7};

· int *p = nums;

在前面講指針數組時(shí),所有指針數組元素都指向一個(gè)數字,那么我們現在可以嘗試用指針數組的每個(gè)元素指向一個(gè)數組:

· //定義一個(gè)二維數組

· int nums[2][2] = {

· {1, 2},

· {2, 3}

· };

· //此時(shí) nums[0]、和 nums[1]各為一個(gè)數組

· int *p[2] = {nums[0], nums[1]};

· //我們可以用指針數組 p 操作一個(gè)二維數組

· //p 為數組 p 的首地址,p[0] = nums[0] = *p,**p = nums[0][0]

· printf('nums[0][0] = %d', **p);

· //指針 整數形式,p 1 移動(dòng)到 nums 的地址,*(p 1) = nums[1],則**(p 1) = nums[1][0]

· printf('nums[1][0] = %d', **(p 1));

· //先*p = nums[0],再*p 1 = &nums[0][1],最后獲取內容*(*p 1)即為 nums[0][1]

· printf('nums[0][1] = %d', *(*p 1));

這里可能不能理解為什么*p 1 = &nums[0][1],而不是 nums[1]。*p 獲得的是一個(gè)一維數組,而 int 數組 1 的跨度只有 4 個(gè)字節,也就是一個(gè)單元。前面 p 是一維數組的指針,其跨度為一個(gè)數組。所以*p 1 = &nums[0][1],而 p 1 = nums[1]。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
指針與動(dòng)態(tài)空間分配http://jpkc.nwu.edu.cn/jsjjc/ebooks/p14.htm
看完還不會(huì )指針,錘自己!
第8章 指針
指針
12 c語(yǔ)言多維數組的指針變量 - 中安網(wǎng)培 - 黑客培訓,安全培訓門(mén)戶(hù)網(wǎng)站
多維數組的指針變量
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久