人妻丰满熟妇无码区乱com|久久婷婷午夜精品二区|一道本国产不卡视频|国产孕妇故爱A级高清片免费看

<tbody id="geoqw"></tbody>
  • <center id="geoqw"></center>
  • <menu id="geoqw"></menu>
  • <center id="geoqw"></center>
    
    <menu id="geoqw"></menu>
  • 電腦編程入門(mén):C語(yǔ)言指針和數(shù)組基礎(chǔ)

    時(shí)間:2022-10-03 09:50:17 電腦入門(mén) 我要投稿
    • 相關(guān)推薦

    電腦編程入門(mén):C語(yǔ)言指針和數(shù)組基礎(chǔ)

      關(guān)于C語(yǔ)言中指針和數(shù)組的爭(zhēng)論就像是一場(chǎng)惡戰(zhàn)。一方面,有些人覺(jué)得,所有人都必須承認(rèn)指針與數(shù)組是不同的。而另一些人則認(rèn)為數(shù)組被當(dāng)成指針來(lái)處理,因此它們不應(yīng)該有什么區(qū)別。這種現(xiàn)象讓人迷惑。然而,這兩種說(shuō)法其實(shí)都是正確的。

    電腦編程入門(mén):C語(yǔ)言指針和數(shù)組基礎(chǔ)


      數(shù)組不是指針,指針也不能說(shuō)是數(shù)組。在C語(yǔ)言中,指針僅在內(nèi)存中代表一個(gè)地址,而數(shù)組是許多連續(xù)的內(nèi)存塊,多個(gè)類(lèi)型相似的元素存儲(chǔ)在其中。更深入的解釋?zhuān)?qǐng)參考我之前的博文《C語(yǔ)言?xún)?nèi)存地址》。在C語(yǔ)言的絕大多數(shù)情況下,數(shù)組被當(dāng)作指針來(lái)處理,這也是使人困惑的地方。

      數(shù)組表示法vs指針表示法

      數(shù)組被當(dāng)作指針來(lái)處理,具體指的下面兩條:

      數(shù)組名變量代表了數(shù)組中第一個(gè)元素的地址。它并不是一個(gè)指針,但卻表現(xiàn)得像一個(gè)不能被修改的常指針一樣。

      程序在與數(shù)組交互的時(shí)候,用指針表示法代替數(shù)組表示法。

      我們來(lái)看點(diǎn)代碼吧。

      // 初始化數(shù)組

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

      // 標(biāo)準(zhǔn)數(shù)組表示法

      int *ptr1 = numbers;

      int val1 = numbers[0];

      // 數(shù)組表示法取地址

      int *ptr2 = &numbers[0];

      int val2 = *(&numbers[0]);

      // 指針加偏移表示法

      int *ptr3 = numbers + 0;

      int val3 = *(numbers + 0);

      // 輸出指針中的地址

      printf("*ptr1 = %p ", (void *)ptr1);

      printf("*ptr2 = %p ", (void *)ptr2);

      printf("*ptr3 = %p ", (void *)ptr3);

      // 輸出地址指向的int值

      printf("val1 = %d ", val1);

      printf("val2 = %d ", val1);

      printf("val3 = %d ", val1);

      我們聲明了一個(gè)包含5個(gè)int的數(shù)組,并將數(shù)組名變量numbers賦給了一個(gè)int指針,ptr1。numbers代表了這個(gè)數(shù)組第一個(gè)元素的地址,將其賦給ptr1正是把它當(dāng)成了指針來(lái)使用。接著我們用數(shù)組表示法訪(fǎng)問(wèn)了第一個(gè)元素的值。

      第二個(gè)例子中,我們用數(shù)組表示法取了數(shù)組中第一個(gè)元素的地址,之后我們用解引用第一個(gè)元素所在地址的方法訪(fǎng)問(wèn)了它。

      第三個(gè)例子中,我們用指針運(yùn)算將數(shù)組中第一個(gè)元素的地址賦值給ptr3,之后我們解引用相同的地址來(lái)得到它的值。

      最后我們將所有存儲(chǔ)在指針中的地址和所有在這些地址的int值輸出到屏幕上。運(yùn)行這段代碼,你會(huì)得到類(lèi)似下面的輸出:

      *ptr1 = 0x7fff6be1de60

      *ptr2 = 0x7fff6be1de60

      *ptr3 = 0x7fff6be1de60

      val1 = 1

      val2 = 1

      val3 = 1

      所有值都是相同的。接下來(lái)再看看下面的代碼:

      // 初始化數(shù)組

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

      int i = 0;

      // 用數(shù)組表示法輸出元素

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

      int value = numbers[i];

      printf("numbers[%d] = %d ", i, value);

      }

      // 用指針加偏移輸出元素(真討厭)

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

      int value = *(numbers + i);

      printf("*(numbers + %d) = %d ", i, value);

      }

      // 僅用一個(gè)指針輸出元素

      int *ptr = numbers;

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

      int value = *ptr++;

      printf("%d, *ptr++ = %d ", i, value);

      }

      運(yùn)行它,你會(huì)得到以下輸出:

      numbers[0] = 1

      numbers[1] = 2

      numbers[2] = 3

      numbers[3] = 4

      numbers[4] = 5

      *(numbers + 0) = 1

      *(numbers + 1) = 2

      *(numbers + 2) = 3

      *(numbers + 3) = 4

      *(numbers + 4) = 5

      0, *ptr++ = 1

      1, *ptr++ = 2

      2, *ptr++ = 3

      3, *ptr++ = 4

      4, *ptr++ = 5

      就像你看到的那樣,所有過(guò)程得到了相同的結(jié)果。

      數(shù)組表示法實(shí)際上就是指針運(yùn)算。C語(yǔ)言標(biāo)準(zhǔn)只是將numbers[0]定義為*(numbers + 0)的語(yǔ)法糖。(譯者注:語(yǔ)法糖,它意指那些沒(méi)有給計(jì)算機(jī)語(yǔ)言添加新功能,而只是對(duì)人類(lèi)來(lái)說(shuō)更容易理解的語(yǔ)法。)無(wú)論何時(shí),你寫(xiě)下一個(gè)數(shù)組表示法,比方說(shuō)numbers[2],都會(huì)被編譯器轉(zhuǎn)換為*(numbers + 2)。這里,numbers表示數(shù)組中第一個(gè)元素的地址,+2則表示用于指針運(yùn)算的'偏移量。

      數(shù)組變量

      我們已經(jīng)展示了,數(shù)組常被當(dāng)作指針來(lái)處理,而且對(duì)于C編譯器而言數(shù)組表示法就是指針運(yùn)算。一些人自然而然地就做出了這樣的假設(shè):既然數(shù)組能被當(dāng)成指針,指針也應(yīng)該能賦值給數(shù)組。這是不對(duì)的,數(shù)組名變量不能被改變。我們看看下面的代碼吧。

      // 初始化數(shù)組

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

      int numbers2[5] = {6,7,8,9,0};

      int *ptr = numbers2;

      // 這不能通過(guò)編譯

      numbers = numbers2;

      numbers = &numbers2;

      numbers = ptr;

      這段代碼不能通過(guò)編譯。試一試,你會(huì)得到以下輸出。

      incompatible types when assigning to type ‘int[5]’ from type ‘int *’

      incompatible types when assigning to type ‘int[5]’ from type ‘int (*)[5]’

      incompatible types when assigning to type ‘int[5]’ from type ‘int *’

      雖然數(shù)組名變量代表了數(shù)組第一個(gè)元素的地址,它卻表現(xiàn)得像一個(gè)不能被更改的常指針一樣。它不能接受一個(gè)別的數(shù)組名變量或是指向另一個(gè)數(shù)組的指針的賦值。思考一下,如果你有一個(gè)數(shù)組名變量A代表一個(gè)數(shù)組,而且你能夠改變A的地址,那被A指向的內(nèi)存將會(huì)發(fā)生生么?

      接下來(lái)看看這段能夠編譯的代碼。

      // 初始化數(shù)組

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

      int numbers2[5] = {6,7,8,9,0};

      int *ptr1 = numbers;

      int *ptr2 = numbers2;

      // 能通過(guò)編譯

      ptr1 = ptr2;

      // 輸出地址

      printf("numbers = %p ", (void *)numbers);

      printf("numbers2 = %p ", (void *)numbers2);

      printf("ptr1 = %p ", (void *)ptr1);

      printf("ptr2 = %p ", (void *)ptr2);

      它會(huì)輸出這樣的結(jié)果:

      numbers = 0x7fff5ea3d230

      numbers2 = 0x7fff5ea3d250

      ptr1 = 0x7fff5ea3d250

      ptr2 = 0x7fff5ea3d250

      雖然不能直接改變數(shù)組名變量,我們?nèi)匀桓淖円粋(gè)指向這個(gè)數(shù)組的指針。代碼中,我們創(chuàng)建了兩個(gè)數(shù)組,兩個(gè)int指針。我們將numbers賦給了ptr1,將numbers2賦給了ptr2。接著我們將ptr2賦給了ptr1,最后輸出結(jié)果。可以看到,ptr1和ptr2都指向了numbers2數(shù)組的第一個(gè)元素。

      總結(jié)

      我希望你們能夠喜歡這篇對(duì)C語(yǔ)言中數(shù)組和指針的概述。我們沒(méi)有囊括關(guān)于指針和數(shù)組的一切知識(shí),但足以作為一個(gè)開(kāi)始。跟往常一樣,我非常愿意接受大家的評(píng)論和建議。

    【電腦編程入門(mén):C語(yǔ)言指針和數(shù)組基礎(chǔ)】相關(guān)文章:

    網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)入門(mén)10-14

    電腦基礎(chǔ)入門(mén)知識(shí)10-04

    電腦入門(mén)基礎(chǔ)小知識(shí)10-03

    c語(yǔ)言編程實(shí)習(xí)心得范文08-01

    電腦系統(tǒng)安裝入門(mén)基礎(chǔ)10-03

    電腦入門(mén):桌面的基礎(chǔ)操作詳解10-14

    新手電腦入門(mén)基礎(chǔ)知識(shí)大全10-11

    鉤針編織基礎(chǔ)入門(mén)基礎(chǔ)10-03

    學(xué)電腦入門(mén)10-11