我编写了一个程序来显示数组的内容,但它显示的是它的地址
I wrote a program to display the content of an array, but it display with its address
我编写了一个程序,该程序将打印一个带有奇数的数组的内容和另一个带有偶数的数组的内容,但是当我想重新打印数组时,它会在内存中显示它及其地址, 我还想打印第一个数组,第二个数组与数组 2 一起包围数组,这意味着数组 1 将在中间,数组 2 在左侧和右侧。 但是我被重新打印阵列一所困, 这是我的代码,
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
int main ()
{
int i,counter[25];
int j,counter2[25];
for(i=0;i<=20;i++){
if(i%2==1)
continue;
counter[i]=i;
cout<<counter[i]<<" ";
}
cout<<"n";
for(j=101;j<=115;j++){
if(j%2==0)
continue;
counter2[j]=j;
cout<<counter2[j]<<" ";
}
cout<<"nn";
for(i=0;i<=20;i++){
cout<<counter[i]<<" ";
}
return 0;
}
输出将如下所示:
0 2 4 6 8 10 12 14 16 18 20
101 103 105 107 109 111 113 115
0 1989701561 2 7208604 4 1990083356 6 1989764433 8 1989701373 10 -1841062257 12 4199040 14 4354336 16 7208680 18 1989725376 20
我很困惑它打印地址?? 我应该为每个元素指定地址吗?
顺便说一句,第二个数组应该以 101 及以上开头。
在您的响应中,计数器和计数器 2 数组的前两行输出是正确的。
第三个输出是基于这样一个事实,即初始化时的数组充满了垃圾值,没有别的。
让我们离开"counter2"数组一次,看看你的代码"Counter"。
我想就是这样了。
int main ()
{
int i,counter[25];
int j,counter2[25];
for(i=0;i<=20;i++){
if(i%2==1)
continue;
counter[i]=i;
cout<<counter[i]<<" ";
}
cout<<"n";
for(i=0;i<=20;i++){
cout<<counter[i]<<" ";
}
return 0;
}
如果您仔细查看循环代码
for(i=0;i<=20;i++){
if(i%2==1)
continue;
counter[i]=i;
cout<<counter[i]<<" ";
}
您正在做的是检查此条件是否为"true"
if(i%2==1)
continue;
那么在"假"上你做的是
counter[i]=i;
cout<<counter[i]<<" ";
在这里,这些值入到您在 if 条件中与之进行比较的相应值"i"。
换句话说,在
如果您正在比较
i=2
in
if(i%2==1)
this will go "false" and to next statement
counter[i]=i;
i.e. counter[2]=2;
你基本上是在数组中插入值,如下所示:
_ 2 _ 4 _ 6 _ 8 _ 10 ...etc
它只修改数组中的特定值,而其他值保持不变。
第二个数组"Counter2"也是如此。
标准输出上打印的值不是地址。它们是存储的值。
您需要知道的第一件事是,除非未初始化,否则每个变量在声明期间都会获得垃圾值。如果初始化一个变量,则该变量将携带该值,直到它被其他语句更改。
- 您可以看到偶数索引 0、2、4、...、20 的值与您在第一个
for
循环中设置的值相同。 - 但是奇数指数的值并不像您期望的那样。因为在第二个
for
循环中,您已经遍历了from 101 to 115
并且没有在正确的索引处设置值。此外,在第二个循环中,您将值存储在数组counter2
中,但最后,您正在打印数组counter
的值。
最后,当您打印数组counter
中的值时,程序会输出当时存储的值。如果未初始化或分配其他值,它将是垃圾值。
您没有打印地址。您正在打印未初始化的整数值。问题出在数组的初始化中。原因是这条线counter2[j] = j;
正在尝试索引数组的第 j 个元素,但 j 从 101 递增到 115。如果您只是想获取从 101 到 115 的偶数,请执行如下操作:
for (int j = 0; j <= 7; j++)
{
counter2[j] = (100 + 2*(j + 1) - 1);
}
当您要编写 for 循环以将元素插入数组时,通常希望递增的变量表示要编辑的元素的索引。
在 C/C++ 中,当您使用整数文本声明具有自动存储持续时间的数组时,例如:
int i,counter[25];
int j,counter2[25];
counter
和counter2
的有效索引0 <= index < 25
。在您的代码中,尽管您if
语句,但当您这样做时:
for(j=0;j<=115;j++){
if(j%2==0)
continue;
if(j<101 && j>0)
continue;
counter2[j]=j;
cout<<counter2[j]<<" ";
}
将101
传递到115
作为索引:
counter2[j]=j;
cout<<counter2[j]<<" ";
这超出了数组边界,并在代码中调用未定义的行为。
此外,对于由于检查以下各项而未通过为其赋值来初始化的所有索引:
if(i%2==1)
continue;
和
if(j%2==0)
continue;
导致这些元素处于counter
状态,并且counter2
未分配包含不确定值的值。任何尝试在变量值不确定的情况下访问具有自动存储持续时间的变量的值都会导致未定义的行为。为了避免跳过索引时出现问题,请在声明数组时初始化数组零的所有元素,例如
int i,counter[25] = {0};
int j,counter2[25] = {0};
总而言之,您可以执行以下操作:
#include <iostream>
#include <iomanip>
#include <string>
int main (void) {
int i,counter[25] = {0};
int j,counter2[25] = {0};
for (i = 0; i <= 20; i++){
if (i % 2 == 1)
continue;
counter[i]=i;
std::cout << counter[i] << " ";
}
std::cout << "n";
for (j = 0; j <= 15; j++){
int v = j + 101;
if (v % 2 == 0)
continue;
counter2[j] = v;
std::cout << counter2[j] << " ";
}
std::cout<<"nn";
for(i = 0; i <= 20; i++) {
std::cout << counter[i] << " ";
}
std::cout << 'n';
}
(注意:包括整个namespace std
不被认为是好的做法。 年长的眼睛欣赏间隔合理的代码......
示例使用/输出
$ ./bin/array_shift_idx
0 2 4 6 8 10 12 14 16 18 20
101 103 105 107 109 111 113 115
0 0 2 0 4 0 6 0 8 0 10 0 12 0 14 0 16 0 18 0 20
仔细查看,如果您有其他问题,请告诉我。
使用单独的索引变量
当您有一个固定数组并且您要在该数组中读取一定数量的值时,这些值可能/可能不少于数组中的元素总数,您将需要保留一个单独的变量(或计数器)来保存填充的元素数。然后,在遍历数组时,您可以从0 <= i < filled
迭代。
在这里,您使用 for 循环变量作为值,并使用循环变量作为索引。当您测试该值,然后continue;
它是否不是您想要的时,您将跳过填充关联的索引。要解决此问题,您只需保留单独的值,以保存数组中最后一个填充的索引。例如:
#define NELEM 25 /* if you need a constant, #define one (or more) */
int main (void) {
int counter[NELEM] = {0}, /* initialize array elements zero */
counter2[NELEM] = {0},
ndx1 = 0, ndx2 = 0; /* separate indexes for counter/counter2 */
变量ndx1
和ndx2
是最后填充在counter
和counter2
中的索引。现在,当您循环时,只有在为数组赋值时才会递增索引,例如
for (int i = 0; ndx1 < NELEM; i++) { /* fill counter w/even values */
if (i % 2 == 1)
continue;
counter[ndx1++] = i; /* assign value/advance index */
}
(注意:这里所有元素都被填充了,但你明白了。您使用自变量。一个用于您生成的值,一个用于数组的索引)
同样,对于counter2
数组,您可以执行以下操作:
for (int i = 0; ndx2 < NELEM; i++) { /* fill counter2 w/odd values */
int v = i + 101; /* add 101 to each value */
if (v % 2 == 0)
continue;
counter2[ndx2++] = v; /* assign value/advance index */
}
使用上述内容的简短示例,用从0
开始的偶数值填充counter
元素,用从101
开始的奇数值填充counter2
,并确保每个数组中的所有值都是连续的,可能类似于:
#include <iostream>
#include <iomanip>
#define NELEM 25 /* if you need a constant, #define one (or more) */
int main (void) {
int counter[NELEM] = {0}, /* initialize array elements zero */
counter2[NELEM] = {0},
ndx1 = 0, ndx2 = 0; /* separate indexes for counter/counter2 */
for (int i = 0; ndx1 < NELEM; i++) { /* fill counter w/even values */
if (i % 2 == 1)
continue;
counter[ndx1++] = i; /* assign value/advance index */
}
for (int i = 0; ndx2 < NELEM; i++) { /* fill counter2 w/odd values */
int v = i + 101; /* add 101 to each value */
if (v % 2 == 0)
continue;
counter2[ndx2++] = v; /* assign value/advance index */
}
std::cout<<"counter:n"; /* output counter values */
for (int i = 0; i < ndx1; i++) {
if (i && i % 10 == 0) /* 10 values per-row */
std::cout << 'n';
std::cout << std::setw(4) << counter[i];
}
std::cout<<"nncounter2:n"; /* output counter2 values */
for (int i = 0; i < ndx2; i++) {
if (i && i % 10 == 0) /* 10 values per-row */
std::cout << 'n';
std::cout << std::setw(4) << counter2[i];
}
std::cout << 'n';
}
示例使用/输出
$ ./bin/array_shift_idx2
counter:
0 2 4 6 8 10 12 14 16 18
20 22 24 26 28 30 32 34 36 38
40 42 44 46 48
counter2:
101 103 105 107 109 111 113 115 117 119
121 123 125 127 129 131 133 135 137 139
141 143 145 147 149
您可以根据需要调整循环限制以仅填充0 - 20
或101 - 115
,也可以简单地迭代少于NELEM
次以生成所需的输出。完全取决于你。关键是,由于您保留了捕获每个数组中填充的元素数量的单独索引,因此您可以采用任何一种方式执行此操作,并且永远不会迭代任一数组中的最后一个填充元素。
在counter2
中仅填充第 1 个 8 个奇数值
例如,如果您只想向counter2
添加101 - 115
而将其他元素保留为未填充状态,则只需更改:
for (int i = 0; i <= 15; i++) { /* fill counter2 w/odd values */
int v = i + 101; /* add 101 to each value */
if (v % 2 == 0)
continue;
counter2[ndx2++] = v; /* assign value/advance index */
}
现在,counter2
的输出将是:
counter2:
101 103 105 107 109 111 113 115
- 显示数组中的学生 ID 和最高分
- 我编写了一个程序来显示数组的内容,但它显示的是它的地址
- 为什么断点显示数组的第二个值是一个大数字?额外学分工作
- 使用指针显示数组的值
- 我无法显示包含整数最大值的索引. 但我可以显示数组中整数的最高值
- 数组:如何在指定索引之前显示数组的第一个和最后一个元素以及数组元素的差异?
- 使用增量/减少操作员在C 中显示数组的奇怪结果
- 将25个甚至整数存储到一个名为intlist的整数阵列中,然后在屏幕上显示数组,并在屏幕上显示名为fivintegers
- 显示数组的问题.一切都放在一个单独的行中,但不放入单独的列中
- strlen 显示数组元素的数量错误
- 我的函数不会用" "替换".",也不会按预期显示数组
- 以C++为单位乘以并显示数组的值
- 找不到标识符,尝试在 C++ 中显示数组值
- 如何显示数组名称中的名称
- 在列表小部件 Qt C++中显示数组内容
- c++将.txt文件中的字符串添加到字符串数组中,并显示数组的值
- C++如何将数组传递给函数,然后调用它来显示数组的值
- 从函数更新(覆盖)和显示数组
- 在单独的数据中显示数组数据
- 仅显示数组文本文件中的第一个字母