博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(原創) 2 dim array該如何完全使用pointer存取? (C/C++) (C)
阅读量:6231 次
发布时间:2019-06-21

本文共 1811 字,大约阅读时间需要 6 分钟。

array和pointer互換,其實只有一個公式:a[i] = *(a+i),任何維度都適用這個公式,以下範例demo 2 dim array該如何使用pointer存取。

 1
ExpandedBlockStart.gif
ContractedBlock.gif
/**/
/* 
 2InBlock.gif(C) OOMusou 2006 http://oomusou.cnblogs.com
 3InBlock.gif
 4InBlock.gifFilename    : TwoDimArrayByPointer.cpp
 5InBlock.gifCompiler    : Visual C++ 8.0 / ISO C++
 6InBlock.gifDescription : Demo how to access two dimension array by pointer
 7InBlock.gifRelease     : 12/12/2006 1.0
 8ExpandedBlockEnd.gif*/
 9
None.gif
10
None.gif#include 
<
iostream
>
11
None.gif
12
None.gif
using
 
namespace
 std;
13
None.gif
14
ExpandedBlockStart.gifContractedBlock.gif
int
 main() 
dot.gif
{
15InBlock.gif  const int SIZEX = 3;
16InBlock.gif  const int SIZEY = 3;
17InBlock.gif
18InBlock.gif  int yokoi[SIZEX][SIZEY];
19ExpandedSubBlockStart.gifContractedSubBlock.gif  for(int i = 0; i != SIZEX; ++i) dot.gif{
20ExpandedSubBlockStart.gifContractedSubBlock.gif    for (int j = 0; j != SIZEY; ++j) dot.gif{
21InBlock.gif      yokoi[i][j] = i + j*2;
22ExpandedSubBlockEnd.gif    }
23ExpandedSubBlockEnd.gif  }
24InBlock.gif
25InBlock.gif
26ExpandedSubBlockStart.gifContractedSubBlock.gif  for(int i = 0; i != SIZEX; ++i) dot.gif{
27ExpandedSubBlockStart.gifContractedSubBlock.gif    for (int j = 0; j != SIZEY; ++j) dot.gif{
28InBlock.gif      cout << yokoi[i][j] << " ";
29ExpandedSubBlockEnd.gif    }
30InBlock.gif    cout << endl;
31ExpandedSubBlockEnd.gif  }
32InBlock.gif
33InBlock.gif  cout << endl;
34InBlock.gif
35ExpandedSubBlockStart.gifContractedSubBlock.gif  for(int i = 0; i != SIZEX; ++i) dot.gif{
36ExpandedSubBlockStart.gifContractedSubBlock.gif    for (int j = 0; j != SIZEY; ++j) dot.gif{
37InBlock.gif      cout << yokoi[i][j] << " ";
38InBlock.gif      cout << *(yokoi[i] + j) << " ";
39InBlock.gif      cout << *(*(yokoi + i) + j)<< " ";
40InBlock.gif      cout << *(*yokoi + i * SIZEX + j) << " ";
41ExpandedSubBlockEnd.gif    }
42InBlock.gif    cout << endl;
43ExpandedSubBlockEnd.gif  }
44InBlock.gif
45InBlock.gif  return 0;
46ExpandedBlockEnd.gif}

37上是正統使用array的寫法,最乾淨也最容易閱讀。

38行是一半array,一半pointer的寫法,有一個觀念需要澄清,2 dim array在C/C++事實上是array of array,也就是C#的jagged array,第一個array是2 dim array的第一個column,第一個array的每個element再存放2 dim array的每一個row,而每個row也是個array,所以yokoi事實上是第一個array的位址,而yokoi[0]為第一個row這個array的位址,yokoi[1]為第二個row這個array的位址,以此類推...,所以yokoi[i] + j為每個element實際的位址,最後再用* dereference取值。

39行寫法完全用pointer,由於yokoi是第一個array的位址,所以*(yokoi + i) 相當於 yokoi[i],再加上j後即為每個element實際的位址。

40行也是完全用pointer,但卻是另外一種觀念,在C/C++中雖然表面上是2 dim array,但骨子裡卻仍是1 dim array,若你觀察2 dim array的位址,會發現其記憶體是連續的,根本就是1 dim array,所以40的寫法是用1 dim array的方式去存取,由於yokoi是第一個陣列,若直接做加減,位址會一次加一列,所以必須在dereference一次:*yokoi,取的第二個array的位址,如此位址相加後,才是一次一個int,最後再dereference取值。

該用哪種寫法呢?

若用array subscripting寫法,則建議第37行的寫法,這種寫法和其他語言類似,一目了然。
若用pointer寫法,則建議39行的寫法,這也是標準的寫法,若對array和pointer概念夠清楚,其實這種寫法也是一目了然。

转载地址:http://cfxna.baihongyu.com/

你可能感兴趣的文章
Oracle数据库的备份方法
查看>>
Selenium 自动登录考勤系统
查看>>
关于如何以编程的方式执行TestNG
查看>>
智能照明造福千家万户 家居智能不再是梦
查看>>
物联网如何跳出“看起来很美”?
查看>>
浅谈MySQL 数据库性能优化
查看>>
《UNIX/Linux 系统管理技术手册(第四版)》——1.10 其他的权威文档
查看>>
灵动空间 创享生活
查看>>
《UNIX网络编程 卷1:套接字联网API(第3版)》——8.6 UDP回射客户程序:dg_cli函数...
查看>>
不要将时间浪费到编写完美代码上
查看>>
《第一桶金怎么赚——淘宝开店创业致富一册通》一一第1章 创业梦想,怎样起步...
查看>>
基于容器服务的持续集成与云端交付(三)- 从零搭建持续交付系统
查看>>
《算法基础:打开算法之门》一3.4 归并排序
查看>>
高德开放平台开放源代码 鼓励开发者创新
查看>>
《高并发Oracle数据库系统的架构与设计》一2.5 索引维护
查看>>
《Exchange Server 2010 SP1/SP2管理实践》——2.4 部署外部网络环境
查看>>
Firefox 是 Pwn2own 2014 上攻陷次数最多的浏览器
查看>>
阿里感悟(十八)- 应届生Review
查看>>
《计算广告:互联网商业变现的市场与技术》一第一部分 在线广告市场与背景...
查看>>
话说模式匹配(5) for表达式中的模式匹配
查看>>