• Thinking in Harmonic
      --- Observation Notes
      • WePortfolio
      • 關於我
      • 生活札記
      • 生活歷程
      • 維基知識
      • 相簿
      • 資源中心
      • 登入
      • 訂閱
        • 訂閱此網誌
      • 推薦網站
        • 電子工程專輯
        • 喬治查爾斯電子電路網
        • 雲端運算技術與應用聯盟
        • ZigBee Alliance
        • ECMA International
        • W3C
        • WSN Research Group
        • Linux Home Automation
        • Tiny OS
        • Android Develop
        • 史丹佛WSNL
        • 台大Insignt Center
        • 交大Eco-City
        • 成大Touch Center
        • 營建署Living 3.0
        • 無線感測網路中心
        • 易立達
        • Control 4
        • UNITEQ
        • 線上字典導覽
        • 識方科技
        • GoldenWell
        • 環境信託
        • 世界展望會
        • 罕見疾病基金會
        • 台灣植物資訊整合查詢系統
        • ISI 資料庫
      • 帳號:
      • 密碼:
      • <%INPUT_CAPTCHA%>
      • <%IMG_CAPTCHA%>
      • 最新回應
        • 溫度感測器DS1821的C語言驅動程式 min 2013-02-05 15:28:21
        • 溫度感測器DS1821的C語言驅動程式 郭晉魁 2011-11-21 19:57:49
        • 溫度感測器DS1821的C語言驅動程式 碰小弟 2011-11-21 18:01:53
        • 溫度感測器DS1821的C語言驅動程式 郭晉魁 2011-11-20 22:02:11
        • 溫度感測器DS1821的C語言驅動程式 碰小弟 2011-11-20 19:53:35
        • 溫度感測器DS1821的C語言驅動程式 郭晉魁 2011-11-20 18:12:32
        • 溫度感測器DS1821的C語言驅動程式 碰小弟 2011-11-20 12:42:16
        • 溫度感測器DS1821的C語言驅動程式 郭晉魁 2011-11-19 19:27:12
        • 溫度感測器DS1821的C語言驅動程式 郭晉魁 2011-11-18 23:50:41
        • 溫度感測器DS1821的C語言驅動程式 碰小弟 2011-11-18 17:30:02
      • 最高人氣
        • 溫度感測器DS1821的C語言驅動程式 (994)
        • Kinect與PC連線 - 最新玩法 (410)
        • 開版囉 (307)
        • 電子震盪器與經濟變動原理 (301)
        • 螞蟻的號令系統? (288)
        • 萬萬股民 要買下濁水溪口國寶溼地 (275)
        • 大學生 (264)
        • 很有意思的寓言-傳統 (258)
        • 大陸行 - 太原科技大學 (256)
        • 德州儀器C6x DSP將可提供Linux 架構 (251)
      • 最多回應
        • 溫度感測器DS1821的C語言驅動程式 (22)
        • 大陸行 - 太原科技大學 (4)
      • 分類
        • 地震觀察 (26)
        • 創新與管理 (3)
        • 懷念回憶 (26)
        • 生活知識 (6)
        • 動手動腦 (20)
        • 學生學習 (100)
        • 小心注意 (5)
        • 詐騙創意 (13)
        • 溫暖社會 (2)
        • 環境還淨 (5)
        • 幽默小品 (22)
        • 產業消息 (18)
        • 教育觀察 (28)
        • 健康管理 (5)
        • 省思感人 (11)
        • 新奇世界 (4)
        • 隨便想想 (19)
        • 研究心得 (102)
      • 逐月回顧
        • 2018-12 (4)
        • 2018-11 (11)
        • 2018-07 (6)
        • 2018-06 (10)
        • 2018-05 (3)
        • 2018-01 (18)
        • 2017-06 (4)
        • 2017-05 (4)
        • 2017-04 (5)
        • 2017-03 (6)
        • 2017-01 (8)
        • 2016-12 (7)
        • 2016-11 (3)
        • 2016-06 (23)
        • 2016-03 (1)
        • 2016-01 (1)
        • 2015-12 (14)
        • 2015-10 (1)
        • 2015-09 (1)
        • 2015-06 (21)
        • 2014-12 (1)
        • 2014-11 (13)
        • 2014-06 (4)
        • 2014-05 (4)
        • 2014-04 (9)
        • 2013-12 (15)
        • 2013-10 (2)
        • 2013-05 (14)
        • 2013-02 (1)
        • 2012-12 (20)
        • 2012-11 (2)
        • 2012-10 (1)
        • 2012-09 (1)
        • 2012-08 (2)
        • 2012-07 (2)
        • 2012-06 (7)
        • 2012-05 (1)
        • 2012-04 (5)
        • 2012-03 (4)
        • 2011-12 (3)
        • 2011-11 (4)
        • 2011-10 (7)
        • 2011-09 (1)
        • 2011-08 (3)
        • 2011-07 (3)
        • 2011-06 (6)
        • 2011-04 (4)
        • 2011-03 (7)
        • 2011-02 (3)
        • 2011-01 (2)
        • 2010-12 (3)
        • 2010-11 (7)
        • 2010-10 (5)
        • 2010-09 (3)
        • 2010-08 (6)
        • 2010-07 (6)
        • 2010-06 (3)
        • 2010-05 (15)
        • 2010-04 (2)
        • 2010-03 (1)
      • 統計資訊
        • 到訪次數106888
          訂閱次數1
          文章總數353
          今日文章0
          回應總數26
          今日回應0
        • c語言有沒有call by reference(or call by address) ?
        • 有許多人對於C語言是否有call by address有些爭論, 以為傳送pointer就是call by address, 以下說明之.


          原始的C語言發明人K&R 在其原著 "The C programming language" 中即已說明, C語言只有call by value, 這點不須爭論.

          在ANSI C的標準文件 (參考: http://eli-project.sourceforge.net/c_html/c.html) 中, 在6.1.2.5小節, 關於Type的敘述中, 有這麼一段話:

          A pointer type may be derived from a function type, an object type, or an incomplete type, called the referenced type. A pointer type describes an object whose value provides a reference to an entity of the referenced type. A pointer type derived from the referenced type T is sometimes called ``pointer to T''.

          這段話的意思是說, 如果有一個referenced type (例如 int*), 所謂的pointer type的值就是這個entity(例如 int)的reference. 在這裡要強調的, 是這個value的東西.

          在 (http://clc-wiki.net/wiki/C_language:Terms:Pass_by_reference) 裡面, 很清楚的說明:

          C does not directly support pass by reference because it always uses pass by value, but a programmer can implement pass by reference by passing a pointer to the variable that the programmer wants passed by reference.

          換句話說, 利用pointer來傳遞位址, 只是實現call by reference的方法, 是把address當成value傳遞, 骨子裡還是只有call by value的方法而已.


          以下用一個程式例來說明: (使用MS visual studio編譯)


          // callbyvalue.cpp : 定義主控台應用程式的進入點。

          #include "stdafx.h"

          void f(int *x)

          {

          (*x)++; //在這裡用debug看變數x, 可看到x代表的是一個值

          printf("x=%x, &x=%x\n",x, &x);

          }

          void g(int &y) //只有c++才有這種語法, c語言沒有

          {

          y=3; //在這裡用debug看變數y, 可看到y等於a

          printf("&y=%x\n",&y, y);

          }

          int _tmain(int argc, _TCHAR* argv[])

          {

          int a=10, *b;

          b=&a;

          printf("a=%d, b=%x\n",a, b); // 如果 b=0x0051fa44的話

          f(b);

          printf("a=%d\n",a);

          f((int*)0x0051fa44); // 這樣也算是call by reference??

          printf("a=%d\n",a);

          f(&a);

          printf("a=%d\n",a);

          g(a); // 還是這樣才算call by reference??

          printf("a=%d\n",a);

          // g((int&)0x0051fa44); // 這個會產生語法錯誤

          getchar();

          return 0;

          }


          以上程式可用單步執行, 到達f((int*)0x0051fa44)時, 將該常數改為實際的b值, 再繼續單步執行

          主程式中第一次以a的位址呼叫f(b), 印出x(位址)之後, 假設a的位址為0x0051fa44,

          再次以常數方式代入呼叫f((int*)0x0051fa44), 因為常數被翻譯成組合語言時,

          是以立即型運算元形式放入累加暫存器, 因此常數並沒有位址 (在compiler過程中,

          並沒有進入變數表內, 所以不會有一個變數名稱佔據某一個位址),

          由此可知f()函數接受的參數其實就是一個value,

          把位址當成value傳遞並不能被稱為call by reference, 只是長得像call by reference而已.

          因為是value, 所以可放入CPU的ALU(累加器)中, 因此才可以被運算 (例如p++),

          而真正的address是被放入CPU的address generator register中, 而此register並不提供加減乘除運算,

          call by reference會以指定變數的位址, 直接以直接定址或間接定址的機械碼, 將該位址直接搬進

          address generator register, 並不會經過CPU的累加器, 所以不可以被運算

          註: 使用 (int*)對0x0051fa44做type casting並不是必要的, 因為C語言並不是strong type language,

          C語言本身並無規定要使用pointer 的 type casting, 但因在MS visual studio會做此檢查, 所以才加上去


          試想, 以下的函數該叫做call by甚麼?

          f2(int **x)

          {

          *(*x+1)=8;

          }


          g()函數才是所謂的 call by reference, 但這是C++才有的語法, C語言沒有

          g()函數中不可出現 &y=3 的敘述, &y不可為lvalue, 常數也不可使用於g()函數呼叫引數

          如果f()被稱為call by reference, 那為何C++又要另外定義一個call by reference的呼叫方法?

          同時, 也沒有任何一個程式語言, 函數的同一個參數可以同時是call by value及call by reference的,

          f()函數既可接受常數參數的呼叫, 就必然是call by value, 而不是call by reference.

          在所有支援call by reference的程式語言中, 也沒有哪個語言是可以在函數中對該位址進行加減乘除運算


          C語言的函數只有call by value的方法, 但是並不支援複雜結構(例如陣列)的call by value,

          如果要使用複雜結構的call by value, 程式員必須自己allocate記憶體並進行複製才可以,

          compiler不會自動幫程式員做這件事 (長得像, 但不是本尊)

        • 檢舉不當內容
          • 分類: 研究心得

          • 引用(0) 2012-11-12 02:16




            引用:




        • 回應與討論