指标与阵列 - csieorg.PDFVIP

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
指标与阵列 - csieorg

指標與陣列 柯向上 Josh Ko 2005.12.28 核心概念 指標與陣列之間的關係,可算是 C 語言最有趣的設計之一。但 C/C++的學習者往往沒辦法掌握關鍵所 在,而弄不清楚指標、陣列的互換關係。說穿了,陣列實用上只有以下一個規則: 出現在算式之中的陣列名稱可被隱喻轉換為「指向陣列第一個元素」的指標。 就是這個規則而已。(事實上本文至此就可以結束了☺。)我在文中暫且把它稱為「(the) Fundamental Rule」。除此之外,陣列沒有別的操作了。別的操作、應用都是由這個規則以及其他C/C++語言基本規 則組合推導而得。 所謂「Array Subscripting」 我說:「除此之外,陣列沒有別的操作」,第一個丟出來的問題一定是:「那a[k]這動作怎麼說?」事實 上,subscripting 運算子 (operator[] )從來就不是針對陣列,而是指標的操作。當我們寫 a[k] 因為這是個算式,根據Fundamental Rule ,a 可以轉換為指標,進而施行subscripting 。後面就較為大眾 所熟知了:對於一個指標p ,若寫 p[k] 這個算式完全等價於 *(p + k) 於是存取到陣列 a 的第k項元素。又因為指標與整數的加法具有交換性,上面的算式可寫為 *(k + p) 於是等價於 k[p] 所以如果寫 1 k[a] 以此存取a 的第k項元素,也毫無問題。此時,要把operator[]解釋成針對陣列的操作,恐怕就比較 困難了。☺ 陣列引數傳遞 首先我們必須了解:不能以一個陣列初始化另一個陣列。也就是說 int a[5]; int c[5] = a; // 錯誤:不能以陣列初始化另一個陣列 第二行無法通過編譯。而函式引數傳遞的方式,是以引數將參數初始化。舉例: void f(int j){ // ... } int i; // ... f(i); 進行呼叫時,f 的參數 j 會以對應引數i 的值進行初始化。陣列無法進行初始化,因此不能當作函式參 數使用。 那麼: void g(int[]); // 或是void g(int[N]); 這又是什麼呢?這參數是隻披上羊皮的狼(對很多初學者而言 ☺),我們知道它不可能是個陣列參數。很 多人都清楚,這個參數事實上是個指標 : void g(int*); 當我們呼叫g 時: int a[5]; g(a); 因為a 出現在算式中,而g 的參數是個指標,於是Fundamental Rule 介入,進行array-to-pointer 轉換, 實際傳入函式的是「指向a 的第0項元素」的指標。 當C++ reference 出現時,情形變得比較不一樣,但仍未脫出Fundamental Rule 的規範。以下手法相當 常見: 2 templatetypename T, size_t N inline size_t array_size(const T ()[N]){ return N; } 這個 function template 可用來取得一個靜態陣列的元素個數。因為這個 function template 的參數是個 reference to array ,可以用陣列進行初始化,所以進行呼叫時,是以貨真價實的陣列把參數初始化。可能 有人問:「那Fundamental Rule 不就沒派上用場?」哈,Fundamental Rule 在此是沒派上用場,但也沒 有錯: 出現在算式之中的陣列名稱可被隱喻轉換為「指向陣列第一個元素」的指標。 也就是說,陣列在必要時可進行轉換,但在array_size的例子裡,陣列不必轉換就已適用,真的進行 轉換還會出問題呢。再舉一個C++ templates的例子([6] ,p. 169 ): templatetypename T const T max(const T a, const T b); std::cout max(Apple, Pear) std::endl; 呼叫者顯然認為Apple和Pear兩個string literals 會以const char*的形式傳入,但因為max 的 兩個參數都是reference ,所以無須進行

文档评论(0)

2105194781 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档