В чем разница между «array» и «& array» для «int array [5]»?

Опубликовано: 6 Января, 2022

Если кто-то определил такой массив, как « int array [5] », что означает « массив » или « & массив »? Они оба одинаковые или разные? У вас может возникнуть соблазн подумать, что они оба будут указывать на самый первый элемент массива, т.е. у них обоих будет один и тот же адрес. Давайте узнаем!

Чтобы это проверить, первое, что приходит в голову, - это следующая программа.

#include "stdio.h"
int main()
{
int array[5];
/* If %p is new to you, you can use %d as well */
printf ( "array=%p : &array=%p " , array, &array);
return 0;
}

Итак, у вас одинаковый адрес для « array » и « & array ». Опять же, вы можете подумать, что оба они одинаковы. Ну, это не так! Почему переменная и ее & (то есть адрес) совпадают. Это не выглядит логичным, но мы видели, что и « массив », и « & массив » печатают один и тот же адрес. Может быть, еще рано делать выводы. Суть этого поста в том, что хотя они оба приводят к одному и тому же адресу, но это разные типы адресов . И в этом разница между « массивом » и « & массивом ».

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

#include "stdio.h"
int main()
{
int array[5];
/* If %p is new to you, you can use %d as well */
printf ( "array=%p : &array=%p " , array, &array);
printf ( "array+1 = %p : &array + 1 = %p" , array+1, &array+1);
return 0;
}

С помощью арифметики указателей мы знаем, что происходит, когда мы добавляем целое число к указателю. Можете ли вы угадать результат работы вышеуказанной программы, не запуская ее? « Массив + 1 » и « & массив + 1 » не должны указывать на один и тот же адрес. Что ж, вы можете быть удивлены

По сути, « массив » - это « указатель на первый элемент массива », а « & array » - « указатель на весь массив из 5 int ». Поскольку « массив » - это указатель на int , добавление 1 привело к получению адреса с приращением 4 (при условии, что размер int на вашем компьютере составляет 4 байта). Поскольку « & array » - это указатель на массив из 5 целых чисел, добавление 1 привело к получению адреса с приращением 4 x 5 = 20 = 0x14. Теперь вы понимаете, почему эти два, казалось бы, похожих указателя отличаются на базовом уровне. Эту логику также можно распространить на многомерные массивы. Предположим, что double twoDarray [5] [4] - это 2D-массив. Здесь twoDarray - это указатель на массив из 4 int, а «& twoDarray» - указатель на массив из 5 строк, массивы из 4 int ». Если это звучит загадочно, вы всегда можете иметь небольшую программу для их печати после добавления 1. Мы надеемся, что смогли уточнить, что любое имя массива само по себе является указателем на первый элемент, но & (то есть адрес) для имени массива будет указатель на сам массив .

Пожалуйста, сделайте Like / Tweet / G + 1, если вы сочтете это полезным. Также, пожалуйста, оставьте нам комментарий для дальнейших разъяснений или информации. Мы будем рады помочь и поучиться

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .