Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 07.08.2016
Сообщений: 105
1

Почему увеличение указателя на sizeof(тип) не тождественно инкременту этого же указателя?

04.11.2016, 20:19. Просмотров 1396. Ответов 4
Метки нет (Все метки)

Всем доброго дня.
Можете обьяснить ,почему при инкриментировании указателя,его значение(адресс) увеличивается на 4 (размер int в байтах),а при увеличении : y(указатель)+=sizeof(int) ,его значение(адресс) увеличивается не на 4 байта а на 16?
В учебнике написано что y(указатель)+=sizeof(int) должно быть эквивалентно y++ ,что и логично
пример программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <stdio.h>
#include <stdint.h>
 
using namespace std;
 
int main()
{
int w,*y=&w;
printf("pointer before : %d\n",y);
y++;
printf("pointer after : %d\n",y);
/* (y++)-y=4 байта(размер int) */
y--;
printf("pointer before : %d\n",y);
y+=sizeof(int);
printf("pointer after : %d\n",y);
/* (y+sizeof(int))-y=16 ???? ведь размер int=4 байта,и сдвиг должен произойти на 4 байта*/
return 0;
}
вывод:

pointer before : 2686728
pointer after : 2686732
pointer before : 2686728
pointer after : 2686744

Написанно и скомпелированно в IDE,CODE::BLOCKs
Компилятор:g++ follow the 1998 ISO C++ language standard
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2016, 20:19
Ответы с готовыми решениями:

Создание указателя на экземпляр класса, описанного после объявления указателя
Здравствуйте! Проблема в том, что нужно сделать так: class A{ public: B* b = nullptr; }; ...

Как сделать функцию от указателя на класс и указателя на метод?
Не получается сделать функцию, параметрами которой являются указатель на класс и на метод....

Преобразование кода без указателя в код с использованием указателя
Правильно ли выполнил? Исходный код без указателя #include &lt;iostream&gt; #include &lt;cstdlib&gt;...

В чём отличие константного указателя и указателя на константу?
int *const p1 и int const* p2 Объясните мне в чём тут отличие.

4
1346 / 986 / 312
Регистрация: 28.07.2012
Сообщений: 2,743
04.11.2016, 20:41 2
Цитата Сообщение от javay Посмотреть сообщение
y(указатель)+=sizeof(int) должно быть эквивалентно y++
В свою очередь y++ эквивалентно y += 1.
Наводит на какие-либо мысли?
1
nd2
3399 / 2781 / 1250
Регистрация: 29.01.2016
Сообщений: 9,423
04.11.2016, 20:41 3
Лучший ответ Сообщение было отмечено javay как решение

Решение

C++
1
2
3
4
5
       ++y;
       y = y + 1;
       
       y += sizeof(int);
       y = y + 4;
1
Эксперт C
24814 / 15371 / 3253
Регистрация: 24.12.2010
Сообщений: 33,117
04.11.2016, 20:44 4
Вот такой это язык Си(++). Если указатель объявлен TYP *p, то вся арифметика с указателем p учитывает sizeof(TYP) без твоей помощи. Т.е. p = p + 10 увеличивает p так, чтобы он указывал на 10-й элемент TYP-массива. Т.е. еси считать в байтах, увеличивает ровно на 10*sizeof(TYP)

Добавлено через 2 минуты
Цитата Сообщение от javay Посмотреть сообщение
В учебнике написано что y(указатель)+=sizeof(int) должно быть эквивалентно y++ ,что и логично
Или протри глаза, или выкинь учебник на помойку. А лучше сжечь, чтоб никому эта ахинея больше не попалась. Если, конечно, ты уверен в своих глазах. Но, имхо, проблема скорее всего в них.
1
0 / 0 / 0
Регистрация: 07.08.2016
Сообщений: 105
04.11.2016, 20:50  [ТС] 5
Все,я догнал
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2016, 20:50

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Возвращение неконстантного указателя из константного указателя на строку
Не могу до конца понять один момент. Допустим, у нас есть функция searchSymbol, которая принимает...

Инкрементальное увеличение значения указателя не работает
Сразу скажу, что практической цели никакой нет, просто пытаюсь понять принцип работы изменения...

Узнать тип значения, зная тип указателя
Здравствуйте! Есть такой код: template&lt;class Iter&gt; void func(Iter first, Iter last) { ...

Несовместимый тип указателя
Здравствуйте. Допустим, есть что-то вроде такого вот: void inputAnalys( const int* num, const...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.