数组声明:
int arr [ ]={34, 65, 23, 75, 76, 33};
四种表示法:(考虑i = 0)
arr[i]
和
*(arr+i)
和
*(i+arr)
和
i[arr]
答案 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) =>通过在内存中添加指向arr
和i 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)只是指向内存位置数组开头的指针。指针是表示特定存储器位置的地址的数字。当你把'*'放在指针前面时,它意味着“给我那个内存位置的数据”。
答案 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个表达式是等价的,因为标准定义了数组下标以及添加的可交换属性。