<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

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

    指針與數組

    Posted on 2009-02-17 00:05 dennis 閱讀(1977) 評論(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、指針始終是指針,它絕不可以寫成數組??梢杂孟聵诵问皆L問指針的時候,一般都是指針作為函數參數時,并且你知道傳遞給函數的實際是一個數組。
    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語言教程。
    主站蜘蛛池模板: 亚洲一级免费视频| 你懂得的在线观看免费视频| 嘿嘿嘿视频免费网站在线观看 | 亚洲精品无码午夜福利中文字幕 | 亚洲精品乱码久久久久久下载| 久9这里精品免费视频| 亚洲综合无码一区二区| 久久久久国产精品免费网站| 亚洲av永久无码制服河南实里| 人妻免费一区二区三区最新| 亚洲第一AAAAA片| 99爱免费观看视频在线| 亚洲黄色在线观看视频| 久久久久久久91精品免费观看| 亚洲中文字幕久久精品蜜桃 | 久久亚洲精品无码网站| 免费人成在线观看网站视频| h视频免费高清在线观看| 激情97综合亚洲色婷婷五| 久久aa毛片免费播放嗯啊| 亚洲jjzzjjzz在线观看| 麻豆国产入口在线观看免费| 日韩免费码中文在线观看| 亚洲女同成av人片在线观看| 在线观看永久免费| 亚洲JIZZJIZZ妇女| 亚洲最大AV网站在线观看| 69视频在线观看免费| 亚洲国产成人久久一区二区三区| 日产国产精品亚洲系列| 久久久久免费精品国产| 亚洲中文无码永久免| 色久悠悠婷婷综合在线亚洲| 亚欧在线精品免费观看一区| 日韩欧美亚洲中文乱码| 亚洲精品无码专区在线在线播放| 两性刺激生活片免费视频| a毛片成人免费全部播放| 亚洲综合激情视频| 亚洲精品国精品久久99热| 亚欧色视频在线观看免费|