无法理解为什么这四个符号是一样的?

时间:2017-07-11 16:10:45

标签: c

数组声明:

int arr [ ]={34, 65, 23, 75, 76, 33}; 

四种表示法:(考虑i = 0)

arr[i]

*(arr+i)

*(i+arr)

i[arr]

6 个答案:

答案 0 :(得分:6)

让我们看一下你的数组在内存中的布局:

low address                   high address
|                             |
v                             v
+----+----+----+----+----+----+
| 34 | 65 | 23 | 75 | 76 | 33 |
+----+----+----+----+----+----+
^    ^    ^    ^
|    |    |    ...etc
|    |    |
|    |    arr[2]
|    |
|    arr[1]
|
arr[0]

第一个元素是 func updateChartData() { let chart = PieChartView(frame: mViewOutlet.frame) // let chart = PieChartView(frame: CGRect(x: 122, y: 235 , width: self.mViewOutlet.frame.size.width, height: self.mViewOutlet.frame.size.height)) // 2. generate chart data entries let track = ["Present","Leave", "EG/LC", "Halfday", "Absent", "Weeklyoff", "Holidays"] // let money = [65, 13, 10, 2] let money = mDaysArray var entries = [PieChartDataEntry]() for (index, value) in money.enumerated() { print("index: \(index) \n value: \(value)") let entry = PieChartDataEntry() if value != 0 { entry.y = Double(value) }else{ } entries.append(entry) // entry.label = track[index] // if we want to remove name label } // 3. chart setup let set = PieChartDataSet( values: entries, label: "Pie Chart") // this is custom extension method. Download the code for more details. //4. set chart color let presentColor = UIColor(red: 80.0/255.0, green: 180.0/255.0, blue: 50.0/255.0, alpha: 1.0) // let lateColor = UIColor(red: 241.0/255.0, green: 194.0/255.0, blue: 114.0/255.0, alpha: 1.0) let leaveColor = UIColor(red: 203.0/255.0, green: 68.0/255.0, blue: 242.0/255.0, alpha: 1.0) let egColor = UIColor(red: 95.0/255.0, green: 180.0/255.0, blue: 239.0/255.0, alpha: 1.0) let halfdayColor = UIColor(red: 82.0/255.0, green: 64.0/255.0, blue: 152.0/255.0, alpha: 1.0) let absentColor = UIColor(red: 242.0/255.0, green: 58.0/255.0, blue: 02.0/255.0, alpha: 1.0) let weekOffColor = UIColor(red: 186.0/255.0, green: 221.0/255.0, blue: 79.0/255.0, alpha: 1.0) let holidayColor = UIColor(red: 35.0/255.0, green: 215.0/255.0, blue: 179.0/255.0, alpha: 1.0) let colors: [UIColor] = [presentColor,leaveColor,egColor,halfdayColor,absentColor,weekOffColor,holidayColor] set.colors = colors let data = PieChartData(dataSet: set) let formatter = NumberFormatter() formatter.numberStyle = .percent formatter.maximumFractionDigits = 2 formatter.multiplier = 1.0 formatter.percentSymbol = "%" formatter.zeroSymbol = "" data.setValueFormatter(DefaultValueFormatter(formatter: formatter)) chart.data = data chart.noDataText = "No data available" chart.usePercentValuesEnabled = true // user interaction chart.isUserInteractionEnabled = false let d = Description() // d.text = "iOSCharts.io" chart.chartDescription = d // chart.tintColor = UIColor.black // chart.centerText = "Pie Chart" chart.holeRadiusPercent = 0.2 chart.chartDescription?.enabled = false chart.legend.enabled = false chart.data?.notifyDataChanged() chart.notifyDataSetChanged() chart.setNeedsDisplay() chart.animate(xAxisDuration: 1.3, yAxisDuration: 1.3) chart.transparentCircleColor = UIColor.clear // self.view.addSubview(chart) self.mPieChartMainView.addSubview(chart) } ,第二个arr[0]非常清楚,这是每个人都学到的东西。不太清楚的是,编译器实际上将arr[1]等表达式转换为arr[i]

*(arr + i)做的是先获取指向第一个元素的指针,然后执行指针算法以获取指向索引*(arr + i)的有用元素的指针,然后取消引用指针以获取其值。

由于添加的commutative属性,表达式i等于*(arr + i),由于上述翻译等于*(i + arr)

i[arr]arr[i]的等效性也是数组的衰减背后的指向其第一个元素的指针。

指向数组第一个元素的指针是*(arr + i)。现在我们知道&arr[0]应该等于arr[0],这意味着*(arr + 0)必须等于&arr[0]。将零添加到任何内容都是无操作,因此导致表达式&*(arr + 0)。只有一个术语且没有操作符的括号也可以删除,留下&*(arr)。最后,地址和解除引用运算符是彼此相反的并相互抵消,只留下&*arr。因此arr等于&arr[0]

答案 1 :(得分:3)

数组中的每个元素在内存中都有一个位置。阵列中的位置是顺序的。 C中的数组是指针,并始终指向集合的第一个方向(数组的第一个元素)。

arr [i] =>获取数组中“i-position”的值。它与arr[i] = *(arr + i)

相同

*(arr + i) =>通过在内存中添加指向arri value的位置来获取内存中的值。

*(i + arr) =>与*(arr+i)相同。总和是可交换的。

我[arr] =>与*(i+arr)相同。这是另一种表达方式。

答案 2 :(得分:1)

它们是相同的,因为C语言规范是这样说的。阅读n1570

答案 3 :(得分:1)

符号a[i]*(a+i)的语法糖。

第一个是数学语法(符号更接近于人类大脑的教育),而第二个直接对应于一个汇编语言。

另一方面*(a+i)=*(i+a)=i[a]因为arithmetic of pointers is commutative

答案 4 :(得分:0)

它的工作原理是因为C中的数组变量(即示例中的arr)只是指向内存位置数组开头的指针。指针是表示特定存储器位置的地址的数字。当你把'*'放在指针前面时,它意味着“给我那个内存位置的数据”。

  • 因此,如果arr是指向数组开头的指针,*(arr)或*(arr + 0)是数组的第0个索引中的数据,并且*(arr + 1)是第一个索引中的数据,依此类推。
  • 一个看起来像 A [B] 的表达式基本上被翻译成 *(A + B)之类的东西。所以, arr [0] = *(arr + 0) arr [i] = *(arr + i)等。
  • 因为 A + B = B + A ,两者是可以互换的。含义 *(arr + i)= *(i + arr)
  • 因为 arr [i] = *(arr + i) *(arr + i)= *(i + arr),所以应该有意义 arr [i] =我[arr]

答案 5 :(得分:0)

这些是相同的,因为定义了数组下标运算符[]

来自C standard的sectino 6.5.2.1:

  

2 后缀表达式后跟方括号[]中的表达式   是数组对象元素的下标。的的   下标运算符[]的定义是E1[E2]   与(*((E1)+(E2))) 相同。由于转换规则   如果+是数组对象,则应用于二进制E1运算符   (等效地,指向数组对象的初始元素的指针)   E2是一个整数,E1[E2]表示E2 - 元素   E1(从零开始计算)。

示例中的表达式arr[i]的格式为E1[E2]。由于标准声明这与*(E1+E2)相同,这意味着arr[i]*(arr + i)相同。

由于添加的可交换属性,*(arr + i)*(i + arr)相同。将上述等价规则应用于此表达式会得到i[arr]

简而言之,这4个表达式是等价的,因为标准定义了数组下标以及添加的可交换属性。