Member 13881117 Ответов: 2

Как мы получили нижеприведенный результат?


// C++ program to illustrate Pointer Arithmetic
#include <bits/stdc++.h>

// Driver program
int main()
{
	// Declare an array
	int v[3] = {10, 100, 200};

	// Declare pointer variable
	int *ptr;

	// Assign the address of v[0] to ptr
	ptr = v;

	for (int i = 0; i < 3; i++)
	{
		printf("Value of *ptr = %d\n", ptr[i]);
		printf("Value of ptr = %p\n\n", ptr);

		// Increment pointer ptr by 1
		ptr++;
	}
}
Выход:
Значение *ptr = 10
Значение ptr = 0x7ffdd7daef10

Значение *ptr = 200
Значение ptr = 0x7ffdd7daef14

Значение *ptr = -673517552
Значение ptr = 0x7ffdd7daef18

Что я уже пробовал:

Внутри тела цикла for я изменил значение с *ptr на ptr[i].Так что теперь я не понимаю, почему 100 не отображается в качестве выходного сигнала?

2 Ответов

Рейтинг:
6

OriginalGriff

Посмотри, что ты делаешь.:

for (int i = 0; i < 3; i++)
    {
    printf("Value of *ptr = %d\n", ptr[i]);
    printf("Value of ptr = %p\n\n", ptr);
    
    // Increment pointer ptr by 1
    ptr++;
    }
Если мы предположим, что адрес, который ptr точки at-это 2000, затем в первый раз вокруг цикла вы печатаете содержимое (2000 + смещение 0) и 2000.
Следующий раз, ptr увеличился, так что теперь 2004 год (целочисленный указатель, поэтому он увеличивается на четыре байта каждый раз), и i также увеличился до 1 - так что вы печатаете содержимое (2004 + смещение 1: 2008) и 2004. И так далее.

Либо не увеличивайте ptr, или не использовать i!


Рейтинг:
18

Richard MacCutchan

Потому что вы увеличиваете значение ptr а также Значение индекса i Используйте одно или другое, а не оба сразу.

for (int i = 0; i < 3; i++)
{
printf("Value of *ptr = %d\n", *ptr); // do not use offset value here
printf("Value of ptr = %p\n\n", ptr);

// Increment pointer ptr by 1
ptr++;
}


KarstenK

И: последний вывод находится вне массива is и поэтому заполнен случайными/мусорными данными. ;-)