- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
下面发生了什么?
以下是 C Primer Plus 的节选:
const float rain[YEARS][MONTHS] =
{
{ 4.3, 4.3, 4.3, 3.0, 2.0, 1.2, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6 },
{ 8.5, 8.2, 1.2, 1.6, 2.4, 0.0, 5.2, 0.9, 0.3, 0.9, 1.4, 7.3 },
{ 9.1, 8.5, 6.7, 4.3, 2.1, 0.8, 0.2, 0.2, 1.1, 2.3, 6.1, 8.4 },
{ 7.2, 9.9, 8.4, 3.3, 1.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 6.2 },
{ 7.6, 5.6, 3.8, 2.8, 3.8, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 5.2 }
};
int year, month;
float subtot, total;
printf(" YEAR RAINFALL (inches)\n");
for (year = 0, total = 0; year < YEARS; year++)
{
// for each year, sum rainfall for each month
for (month = 0, subtot = 0; month < MONTHS; month++)
{
subtot += rain[year][month];
}
printf("%5d %15.1f\n", 2010 + year, subtot);
total += subtot; // total for all years
}
我必须将其更改为使用指针而不是数组下标。
所以我选择了:
[....]
float (* rainPointer)[2];
rainPointer = rain;
[....]
subtot += *(*(rainPointer + year) + month);
这适用于第 0 年。年份正确递增,月份正确重置。但是,第 1 年并没有指向我期望的位置。我已经经历了一百万次,我并排运行它们,rainPointer 总是(在我看来)似乎是正确的,年份和月份总是正确的。
我通过谷歌找到了答案,我应该使用:
subtot += *(*(rain + year) + month);
rain 和 rainPointer 有什么区别?如果它们都指向两个 int 数组的开头,为什么它们不一样?
有些事情正在发生,我显然没有意识到,或者完全没有意识到。
最佳答案
rain 是一个声明为 like 的二维数组
const float rain[YEARS][MONTHS];
在表达式中,数组的名称被转换为指向数组第一个元素的指针。例如,如果你有一个数组
T rain[YEARS];
然后在表达式中 rain
被转换为 T *
类型的指针
其实二维数组就是一个一维数组元素依次为一维数组。
因此声明
const float rain[YEARS][MONTHS];
可以这样写
typedef float T[MONTHS];
const T rain[YEARS];
其中 T 的类型为 float [MONTHS}
因为 rain
被转换为指向它的第一个元素的指针,即指向它的第一行的指针然后由于指针算术表达式 rain + year
是指向它的指针到今年对应的一维数组(行)。
表达式 *(rain + year) 产生这个数组就是这一行。
所以 *(rain + year) 是一维数组中的某一行。再次将数组转换为指向其第一个元素的指针。元素的类型是 const float
因此表达式 *(rain + year) + month
是指向此一维数组(行)中对应于给定的月份。
最后的表达式 *(*(rain + year) + month)
产生行的这个元素。
因此,使用表达式 rain + year
可以遍历行。使用表达式 *(rain + year) + month
遍历给定行的元素.
如果你只想用指针重写循环,那么它们看起来像
const float ( *rain_ptr )[MONTHS];
const float *month_ptr;
float total = 0.0f;
for ( rain_ptr = rain; rain_ptr != rain + YEARS; ++rain_ptr )
{
// for each year, sum rainfall for each month
float subtot = 0.0f;
for ( month_ptr = *rain_ptr; month_ptr != *rain_ptr + MONTHS; ++month_ptr )
{
subtot += *month_ptr;
}
printf("%5d %15.1f\n", 2010 + rain_ptr - rain, subtot);
total += subtot; // total for all years
}
当然,如果编译器允许,则无需在循环之前声明指针。最好在循环语句中声明它们。
关于c - float arrayName[][] 和 float (* arrayNamePointer)[] 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29459337/
所以我一直在观看 freeCodeCamp 的 Vue Youtube 教程。 他们曾经使用过这段代码: let answers = [...this.currentQuestion.incorrec
这个问题在这里已经有了答案: Understanding slicing (38 个答案) 关闭 7 年前。 我刚刚遇到了 Python 的问题,最终我自己解决了。虽然我仍然想知道使用 有什么区别
为什么要声明一个数组 type[] arrayName 而不是 type arrayName[] 我安装了一个名为 programming hub beta app 的应用程序来自 google pl
“array1.equals(array2) 比较array1 和 array2 是否引用同一个数组对象”这句话写在我的 java 书中,但我不明白它的意思...我的意思是当数组引用同一个对象时?提前
我想知道是否可以创建两个具有相同名称但具有不同大小和不同 ID 的寄存器。示例我需要创建一个包含 40 个元素的 MenuRegister 和另一个包含 10 个元素的 MenuRegister;我正
根据我在 Java 中学到的知识,数组是作为引用传递的。这意味着指针在 java 内部使用。 在 C 中,每当我们在函数内传递数组时,它也是通过引用传递的,这就是为什么我们不能使用 sizeof()
这里我只想知道在这个语句中使用这个增量运算符时执行了什么操作。在数组之前使用增量运算符意味着什么? 最佳答案 在其他地方都意味着同样的事情:增加其后面的内容。 这里,那个东西是arrayname[va
我知道可以通过执行 ${#arrayname[@]} 在 bash 中获取数组的长度。 我的问题是:这只是我必须记住的内容,还是可以将此语法分解为可理解的部分?例如,@ 符号是指人们希望在何处找到索引
对于下面的代码,为什么arrayname [i]在这种情况下不等于*(arrayname + i)并且输出可能很奇怪: #include using namespace std; struct fi
我有一个 jQuery ajax 调用来填充一个数组;该数组应该可以在另一个函数中访问。它实际上存在于 FireFox 和 Safari 中,但不在 IE 中。IE 说: SCRIPT5007 无法获
下面发生了什么? 以下是 C Primer Plus 的节选: const float rain[YEARS][MONTHS] = { { 4.3, 4.3, 4.3, 3.0
我正在尝试从包含表单输入字段的数组中删除某些值: allFields = theForm.getElementsByTagName("INPUT"); for(j = 0; j =0; j--){
我环顾四周,但找不到任何关于以下内容之间实际差异的好文档: Ember.Object.extend({ // ... myProperty1: function() { /* ... */ }
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
作业:编写一个函数,假设 UPC 代码是音频/视频产品,并返回一个字符串,指示它是哪个产品。这是我必须为本实验编写的最后一个函数,我无法弄清楚如何从该函数返回字符数组。条形码数组是用户输入的 12 位
我正在尝试格式化一个字符串,每个单词之间的空格数需要根据每个字符串进行更改。我已经完成了计算所需空格数量的代码。我创建了一个包含多个“”元素的数组,我用这些元素来更改每个单词之间的空格数。如何打印数组
我将多维数组理解为指向指针的指针,但也许我错了? 例如,我虽然: char * var = char var[] char ** var = char* var[] 或 char var[][] ch
有一个名为countingSort的程序,下面列出了其中的一段代码,它通过计算每个数字出现的次数来处理整数数组a在 a 中,然后使用计数将 a 的元素分配给结果数组 result 以确定它们的位置。
我是一名优秀的程序员,十分优秀!