Всё верно, но это не значит что указатель будет прыгать по 8 байт всегда, если бы так было ты бы адресовать ничего кроме 1 типа size_t не смог.
от int ** к другому int ** я иду с шагом в 8байт
Всё верно ты гуляешь по памяти от одного указателя до другого
от int * к другому int * я иду с шагом в 4байта
Всё правильно ты гуляешь по памяти от одного значения int на который ссылается указатель на него до другого.
Ещё раз, указатель это вычисляемый тип, ещё раз говорю отложи ПК в сторону, возьми ручку и бумажку нарисуй массив памяти квадратиками, пусть несколько массивов даже, каждая ячейка будет иметь свой размер, рядом нарисуй массив укзателей на указатель и теперь сам руками вычисли смещения которые нужно прибавлять у указателю на джанные и к указателю на указатель что бы получить следующее значение в памяти. И всё прояснится. Оно и сейчас на виду лежит. Но лучше пусть тебя осенит.
Вот наводка, имеем массив char по 1 байту 10 букв и указатель на этот массив что нужно прибавлять к указателю что бы получить букавки? Нарисуй это. А теперь у нас есть массив из int по 4 байта из 10 штук проделай тоже самое. Проделай тоже самое с массивом указателей на указатель. Видишь разницу?
Я не программист мне пофиг и к компуктерам отношения не имею вообще, ну на хлебозаводе разве что раньше 1 кнопку нажимал большую такую красную тестоделитель запускать и всё =)
Погоди, у него уже есть вся инфа просто не доперает. Если руки не сложит то у него случится ЭВРИКА! Пока просто небольшой затуп, я раньше тоже тупил так знатно по этой хрени. Это бесполезно объяснять, эту хрень нужно просто понять самостоятельно, именно понять почему вот так, а не как так. Типа чик и «Ааааааааа пооонял! ахаха ахаха» Лучший способ это нарисовать, так как память линейна и всё можно отобразить хоть прям в транзисторах если упороться, но достаточно квадратиков на тетрадке с калькулятором (что бы не сфейлится)
если размеры их равны, то и там и там я должен идти или с шагом в 4байта или с шагом в 8байт.
int** у тебя лежит в регистре, размер которого 64 бита.
int* у тебя лежит в регистре, размер которого 64 бита. Попадает он туда из памяти по инструкции movq, которая перемещает 64 бита. Правда, у тебя в посте просто «mov», но если я правильно помню синтаксис AT&T, это либо опечатка, либо ассемблер сам догадывается, что должно быть movq.
Поэтому размеры их равны, оба занимают 64 бита.
Их размер никак не зависит от того, какие числа к ним нужно прибавлять или отнимать.
А чтобы понять, какие числа надо прибавлять и как куда надо шагать, ответь на такой вопрос.
В регистре %rbx лежит адрес массива из трёх int'ов, каждый из которых больше ноля. В регистре %rax лежит ноль. Я хочу, чтобы первый int из массива, адрес которого лежит в %rbx, попал в %rax. Как мне это сделать? Варианты ответа:
Каждый из них когда то сидел и так же тупил. Рудигер Гамм в своё время не мог сложить в уме 37 + 325, но потом устроил своему мозгу Садом и Гоморру в течении нескольких лет и стал самым способным к сложным арифметическим вычислениям в уме (известным)человеком в мире.
Не понимание не порок, это всего лишь знания причём придуманные другими в большинстве своём. Вопрос только в том насколько ты специализируешься и сколько приложишь сил. (Ну если нет патологий или особенностей)
Это никак не оправдывает того, что программисты уже одно дорогой на улице, кто-то из них возможно не сможет приспособиться к другой жизни и умрет, понимаешь ли ты какой механизм ты запускаешь этими ответами?!
лучше врать, как вы. и бить по рукам тех, кто хочет сказать правду. тема уже закрывается. пустая болтовня напрягает.
я с уважением отношусь к вам, но тут вы что-то не то мелите. даже не мелите, а несете дичь.
Ну собственно так и есть, все ответы были уже на первой странице даны, дальше вы просто тупили, на второй разжевали окончательно. Теперь время для развлечения, а ты иди оформляй лабораторку или что ты там делаешь.
и то и то правильно и movq (%rbx), %rax и movl (%rbx), %eax
Да ну? Совершенно пофиг, перемещать ли 8 байт или 4?
Слушай, у тебя, по-моему, более серьёзные проблемы с пониманием, что происходит.
Следующий код напечатает полное значение %rax (в шестнадцатеричном виде) после первого и после второго вариантов:
#include <stdio.h>
__attribute__((naked)) long method1(int* P) {
/*
__attribute__((naked)) запрещает генерировать
«лишний» код на входе в функцию и выходе из неё.
По конвенции System V ABI:
- rdi = P,
- возвращаемое значение ожидается в rax.
*/
__asm__(
"movq (%rdi), %rax\n"
"ret"
);
}
__attribute__((naked)) long method2(int* P) {
__asm__(
"movl (%rdi), %eax\n"
"ret"
);
}
int main() {
int my_array[] = {1, 2, 3};
printf("%lX\n", method1(my_array));
printf("%lX\n", method2(my_array));
}
Зря вы так нападаете на него. По-моему вы тоже недоганяете.
Или вы этого как и того, под бан хотите подвести?
[code]
mov %rdi, rbx%; пишу из примера выше. Криво чтобы было вам лучше понятно.
mov $1, %rax
lea 0(,%rax, 4), %rax; что будет ошибка? Нет, не будет.
movl (% rax, %rbx), %eax;
[/code]
Что щас будет лежать в rax и в eax? Я скажу сразу, что одно и тоже.
mov %rdi, rbx%; пишу из примера выше. Криво чтобы было вам лучше понятно.
mov $1, %rax lea 0(,%rax, 4), %rax; что будет ошибка? Нет, не будет.
movl (% rax, %rbx), %eax;
Может на простом примере будет проще понять.
Вот, например, есть у тебя указатель на структуру размером 600 байт.
Для того, чтобы сдвинуться на следующий элемент, к указателю надо прибавить 600 байт.
Но это ведь не значит, что у тебя размер указателя 600 байт.