莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          指針與數組

          Posted on 2009-02-17 00:05 dennis 閱讀(1983) 評論(4)  編輯  收藏 所屬分類: linux & C
          一、什么時候數組和指針是相同的
          1、表達式中的數組名(與聲明不同)被編譯器當作一個指向該數組第一個元素的指針
          因此如a[i]這樣的訪問都被編譯器改寫或解釋為*(a+i)的形式,同樣取下標操作符的操作數是可交換的,所以a[3]可以寫成3[a],不過通常你不會這樣做。

          2、下標總是與指針的偏移量相同,下標*sizeof(元素類型)就是偏移數組起始地址的實際字節數。

          3、“作為函數參數的數組名”等同于指針,任何傳遞給函數的數組參數都會被轉換成指針,這是基于效率考慮,避免了數組的拷貝。在函數內部,數組參數都將被轉換成一個指針,要牢記這一點,因此如:
          void test(char a[10])
          {
             printf(
          "%d\n",sizeof(a));
          }

          顯然應該打印指針大小4,而非數組大小。另外,注意數組參數的地址跟數組參數第一個元素的地址并不相等,在表達式中兩者一致,但是在函數調用中,由于數組參數指針也是臨時變量,因此兩者的地址是不一樣的。
          可以通過下列程序觀察:

          #include <stdio.h>
          #include 
          <stdlib.h>
          void test1(char a[])
          {
              printf(
          "&a=%x,&(a[0])=%x,&(a[1])=%x\n",&a,&(a[0]),&(a[1]));
          }
          void test2(char *b)
          {
              printf(
          "&b=%x,&(b[0])=%x,&(b[1])=%x\n",&b,&(b[0]),&(b[1])); 
          }
          int main(int argc, char *argv[])
          {
            
          char ga[]="hello";
            printf(
          "&ga=%x,&(ga[0])=%x,&(ga[1])=%x\n",&ga,&(ga[0]),&(ga[1])); 
            test1(ga);
            test2(ga);
            system(
          "pause");
            
          return 0;
          }


          二、指針跟數組什么時候不同
          1、如果定義了一個數組,在其他文件對它進行聲明也必須聲明為數組,定義和聲明必須匹配,指針也是如此。
          2、指針始終是指針,它絕不可以寫成數組。可以用下標形式訪問指針的時候,一般都是指針作為函數參數時,并且你知道傳遞給函數的實際是一個數組。
          3、數組名是不可改變的左值,因此如
          int array[100],array2[100];
          array
          =array2;
          array++;
          array--;
           
          都將出錯,但是在函數內部:

          int array2[100];
          void fun(int array[])
          {
            array
          =array2;
          }

          卻可以,因為在函數內部array雖然被聲明為數組實際上卻是指針。







          評論

          # re: 指針與數組  回復  更多評論   

          2009-02-18 20:03 by ychael
          轉到C了啊?

          # re: 指針與數組  回復  更多評論   

          2009-02-18 23:20 by dennis
          @ychael
          談不上轉,C/c++本來就有一直在學,最近算是用上了,稍微深入下。

          # re: 指針與數組  回復  更多評論   

          2013-01-04 22:23 by birduu.com
          2、指針始終是指針,它絕不可以寫成數組。
          這點有點問題的。

          # re: 指針與數組  回復  更多評論   

          2013-01-04 22:27 by birduu.com
          比如有定義 char *p="birduu.com"; 寫成p[0]就代表字母b,其它同理。
          歡迎到birduu.com這個網站來看看,它提供了簡明的C語言教程。
          主站蜘蛛池模板: 岳阳市| 文安县| 准格尔旗| 乐都县| 礼泉县| 黄梅县| 日喀则市| 佛山市| 杨浦区| 自贡市| 呼图壁县| 花垣县| 日喀则市| 瑞金市| 枣庄市| 广东省| 汝城县| 丰都县| 乌拉特中旗| 崇义县| 乌海市| 乌审旗| 广灵县| 容城县| 易门县| 郯城县| 桐庐县| 互助| 大姚县| 龙口市| 迁西县| 措美县| 休宁县| 宝鸡市| 宁德市| 南江县| 葵青区| 安福县| 遵义市| 志丹县| 朝阳区|