亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

C語(yǔ)言 百分網(wǎng)手機(jī)站

C語(yǔ)言指針和數(shù)組的學(xué)習(xí)方法

時(shí)間:2020-09-22 08:03:49 C語(yǔ)言 我要投稿

C語(yǔ)言指針和數(shù)組的學(xué)習(xí)方法

  C語(yǔ)言中的指針和數(shù)組一直是讓自己覺得頭疼的問題,最近好好研究了一下,將自己的體會(huì)寫下來(lái),當(dāng)做總結(jié)吧。

C語(yǔ)言指針和數(shù)組的學(xué)習(xí)方法

C語(yǔ)言指針和數(shù)組的學(xué)習(xí)方法

  先說指針,首先指針是一個(gè)變量,但它存的是變量的地址,利用指針可以間接訪問一個(gè)變量,比如下面這個(gè)例子:

  int a;

  int *p=&a;

  定義了一個(gè)整型變量a,定義了一個(gè)指向整型變量的指針變量p,這時(shí)候指針變量p里面存的就是整型變量a的地址。在后面要為a賦值的時(shí)候,比如賦值為10,可以這樣寫:a=10;也可以這樣寫:*p=10;這兩個(gè)表達(dá)式都是等價(jià)的,也就是說,可以通過*這個(gè)符號(hào),去訪問某個(gè)地址的`內(nèi)容。我覺得之前看過的一個(gè)比喻非常好(具體出處忘了),說*這個(gè)符號(hào)就像一把鑰匙,而指針變量就像一把鎖,拿*這把鑰匙把指針變量這把鎖打開,然后就能往打開后的這個(gè)空間里面存放東西。我覺得指針這個(gè)東西很神奇,因?yàn)樗苤赶虿煌淖兞,即不同的空間。

  再來(lái)說數(shù)組,數(shù)組最頭疼的就是數(shù)組名,但數(shù)組名的定義已經(jīng)很明確了,數(shù)組名是指向數(shù)組首元素的指針常量,這個(gè)定義簡(jiǎn)直就是一針見血,來(lái)看一些例子:

  1.

  int n[10] ;

  定義了一個(gè)有10個(gè)元素的整型數(shù)組n,那么根據(jù)定義,數(shù)組名n和&n[0]是等價(jià)的,如果我們這樣操作:n+1,那么n+1就和&n[1]是等價(jià)的,因?yàn)檫@里的n是一個(gè)指向整型變量的指針常量,這里n的類型很重要。

  2.

  int n[10][10];

  定義了一個(gè)有100個(gè)元素的二維整型數(shù)組n,那么n是否和&n[0][0]是等價(jià)的呢?答案是否定的。當(dāng)我們定義了n[10][10]這個(gè)二維數(shù)組時(shí),編譯器“咔嚓”、“咔嚓”將一段內(nèi)存空間剪成10份,然后又“咔嚓”、“咔嚓”將每一份空間再剪成10份,然后便得到了100個(gè)最小空間為一個(gè)int型大小的空間,那么n代表什么呢?數(shù)組名的定義:數(shù)組名是指向數(shù)組首元素的指針常量,這里n代表指向上面編譯器第一次將內(nèi)存“咔嚓”、“咔嚓”剪成10份的首元素(里面包含10個(gè)int型)的指針常量,這就是n的類型,很明顯,n的類型不是一個(gè)指向int類型的指針變量,所以n和&n[0][0]并不等價(jià)。這時(shí)我們?nèi)绻@樣操作:n+1,那么n+1便指向了上面編譯器“咔嚓”的第二段,寫到這你會(huì)想,既然n和&n[0][0]并不等價(jià),那么n和&n[0]是否等價(jià)呢?答案是對(duì)的。多維數(shù)組有個(gè)很特殊的地方,因?yàn)樗有這樣的數(shù)組名:n[0],這個(gè)代表什么呢?答案就是n[0]才是和&n[0][0]等價(jià)的。所以最后得出的結(jié)論是:*n[0]代表n[0][0],*n代表n[0],**n代表n[0][0],這種感覺就像,沒開鎖的時(shí)候(n),在你面前放著的是整個(gè)大寶箱(整個(gè)數(shù)組n[10][10])里面的第一個(gè)大寶箱,里面裝著10個(gè)小寶箱(n[0]),當(dāng)你第一次把鎖打開(*n),你面前放著的是10個(gè)小寶箱里面的第一個(gè)小寶箱,當(dāng)然你也可以選擇第二個(gè)(*n+1),你再一次把鎖打開(**n),就能看見寶石啦!

  更多維的數(shù)組也可以這樣分析。

  為了驗(yàn)證上面的說法,在C編譯器里面輸入下面的代碼:

  #include "stdio.h"

  main()

  {

  int n[2][2] = {1, 2, 3, 4};

  printf("n[0][0] is %d ", n[0][0]);

  printf("*n[0] is %d ", *n[0]);

  printf("**n is %d ", **n);

  printf("*(*n+1) is %d ", *(*n+1));

  printf("**(n+1) is %d ", **(n+1));

  printf("n[0] is %d ", n[0]);

  printf("*n[0] is %d ", *n[0]);

  printf("n is %d ", n);

  printf("*n is %d ", *n);

  }

  運(yùn)行結(jié)果是:

  運(yùn)行結(jié)果和上面分析的一致。但,這里有個(gè)問題是,既然n[0]和n的結(jié)果是一樣的,那為什么*n[0]和*n的結(jié)果不一樣呢?原因是類型不一致,*n[0]直接就把小寶箱打開了,但*n才剛打開上一層呢。但C語(yǔ)言提供了穿越的方法,這樣:*(int *)n,把n直接強(qiáng)制轉(zhuǎn)換成一個(gè)指向int類型的指針,然后用*打開,便取得了寶石,太神奇了!

【C語(yǔ)言指針和數(shù)組的學(xué)習(xí)方法】相關(guān)文章:

C語(yǔ)言指針數(shù)組的概念10-22

C語(yǔ)言數(shù)組與指針詳解11-05

C語(yǔ)言指針和數(shù)組基礎(chǔ)知識(shí)10-04

C語(yǔ)言中指針與數(shù)組的區(qū)別10-05

C語(yǔ)言指針函數(shù)和函數(shù)指針詳解06-10

C語(yǔ)言指針教學(xué)11-05

C語(yǔ)言中的指針和內(nèi)存泄漏10-05

C語(yǔ)言指針的用法10-05

C語(yǔ)言指針的傳遞10-06