我对打印指针值和数组有疑问。
int arr[5] = { 1, 2, 3, 4, 5 };
int * ptr = arr;
for (int i = 0; i < 5; i++) {
(*ptr) += 2;
ptr++;
printf("%d", (*ptr));
}
上面是我首先输入的内容,但是没有用。所以我擦除了printf行,并输入了一个新的代码。而且有效。
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
我知道第二个为什么起作用,但仍然不明白第一个为什么不能起作用。
预期输出为3 4 5 6 7,但是第一个代码的实际输出为 2 3 4 5 -858993460
答案 0 :(得分:8)
int arr[5] = { 1, 2, 3, 4, 5 };
int * ptr = arr;
for (int i = 0; i < 5; i++) {
(*ptr) += 2;
ptr++;
printf("%d", (*ptr));
}
原因是您要先增加指针,然后再打印其内容。
也许您需要先打印内容,然后将其递增以指向下一个元素。
int arr[5] = { 1, 2, 3, 4, 5 };
int * ptr = arr;
for (int i = 0; i < 5; i++) {
(*ptr) += 2;
printf("%d", (*ptr));
ptr++;
}
答案 1 :(得分:1)
错误的原因是您在打印当前值(您实际要打印的值)之前将ptr指向下一个值。 让我们逐行考虑for循环的第一步,并记住在开始时,将ptr指向数组的第一个元素(int * ptr = arr;):
希望您能了解for循环的后续步骤。
答案 2 :(得分:0)
它不起作用的原因是因为您在打印出来之前先增加了指针。
for (int i = 0; i < 5; i++) {
(*ptr) += 2;
/* ptr++; */
printf("%d", *ptr++);
/* ^^ increment after */
}
答案 3 :(得分:0)
正如这里的人所说,您的输出是错误的,因为您在打印内容之前先增加ptr。
获得“ -858993460”之类的值的原因是
ptr = arr
将ptr设置为阵列的存储位置。这种工作方式是,arr有一个特定的内存位置,并保留该内存位置及其后的所有内存位置,直到memorylocation +(length-1)。
因此,假设arr位于位置“ 15007140”。
然后在每个存储位置上设置值,如下所示:
15007140 = 1
15007144 = 2
15007148 = 3
15007152 = 4
15007156 = 5
执行ptr=arr
本质上设置了ptr = 15007140。调用(* ptr)时,您可以访问内存位置15007140中的值。执行ptr ++会将15007140增加到15007144。如果调用(* ptr),则可以访问该位置中的值,在这种情况下为2。>
如果您进一步增加ptr,实际上可以将其增加到15007156(数组的末尾)之外,从而可以访问内存地址及其值,而这些地址和值都不是代码的直接部分(如您所见) -858993460)。
因为ptr从第一个数组位置的地址开始,在打印之前进行ptr++;
,所以最终要首先打印数组位置arr [1]的值,最后打印“ arr [6]”(但是因为您的数组只有长度5,所以“ arr [6]”实际上与您的内存中的数组无关)
“正确”的代码为:
for (int i = 0; i < 5; i++) {
(*ptr) += 2;
printf("%d\r\n", ptr);
ptr++;
}
答案 4 :(得分:-1)
在第一个代码中: (* ptr)+ = 2; 将'ptr'指向的值增加2。
ptr ++; :它将指针增加位置1,即指向下一个元素。在循环结束时,它指向具有垃圾值的arr [5]。
答案 5 :(得分:-1)
如果您已经在使用for循环。 将ptr ++替换为ptr + i。
int arr[5] = { 1, 2, 3, 4, 5 };
int * ptr = arr;
for (int i = 0; i < 5; i++) {
*(ptr + i) += 2;
printf("%d", *(ptr + i));
}