打印指针值与数组的区别

时间:2019-07-17 09:13:47

标签: c

我对打印指针值和数组有疑问。

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

6 个答案:

答案 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;):

  1. (* ptr)+ = 2; -此行等效于(* ptr)=(* ptr)+ 2;这意味着“将ptr指向的内存地址中的值增加2”,因此现在数组的第一个元素为3(ptr不变,它指向数组的第一个元素)。
  2. ptr ++; -此行以ptr递增,换句话说,ptr现在将指向下一个内存位置,在您的情况下,则是数组的第二个元素。第一个元素为3,第二个元素的值保持不变。
  3. printf(“%d”,(* ptr)); -此行将打印存储在ptr所指向的内存位置中的值,但是您已将ptr指向上一行中的下一个位置,因此ptr正如我之前所说的那样指向第二个元素。

希望您能了解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));
}