Почему адрес указателя массива совпадает с данными, хранящимися в этом указателе? - PullRequest
0 голосов
/ 09 октября 2018

Если вы попробуете этот фрагмент кода

#include<stdio.h> int main() { 


// Pointer to an integer 
int *p;  

// Pointer to an array of 5 integers 
int (*ptr)[5];  
int arr[] = { 3, 5, 6, 7, 9 };

// Points to 0th element of the arr. 


// Points to the whole array arr. 
ptr = &arr;  

printf("p = %p, address of P = %p\n", p, &p); 
return 0; }

Вы получите что-то вроде p = 0x7fff8e9b4370, P address = 0x7fff8e9b4340, что означает, что адрес указателя P является чем-то, а данные внутри него - другим

, ноесли вы попробуете то же самое с указателем массива, как это

#include<stdio.h> int main() { 


// Pointer to an integer 
int *p;  

// Pointer to an array of 5 integers 
int (*ptr)[5];  
int arr[] = { 3, 5, 6, 7, 9 };

// Points to 0th element of the arr. 
p = arr; 

// Points to the whole array arr. 
ptr = &arr;  

printf("arr  = %p, arr address = %p\n", arr, &arr); 
return 0; } 

Вы получите что-то вроде arr = 0x7ffda0a04310, arr address = 0x7ffda0a04310

Так почему же данные указателя совпадают с адресом указателя вобъем памяти ?!!когда мы разыменовываем адрес указателя arr, мы должны получить число 3, но как я понимаю из этого, адрес 0x7ffda0a04310 в памяти имеет 0x7ffda0a04310 в качестве данных

, так где я ошибаюсь?

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

печать p означает печать p, а p - адрес целого числа или адрес целочисленного массива.

печать &p означает местоположение печатиp в памяти.

печать arr покажет адрес первого элемента массива, это &arr[0].

печать &arr покажет расположение arr в памяти, это также адрес первого элемента массива

, поэтому печать p будет отличаться от печати &p.arr и &arr - это разные типы, но это даст вам одинаковый результат.

0 голосов
/ 09 октября 2018

Вы обнаружили, что адрес массива совпадает с адресом его первого члена.

Когда вы используете массив arr в выражении, в most случаев, когда он распадается на указатель на свой первый элемент.Таким образом, arr в выражении эквивалентно &arr[0].Поскольку члены arr имеют тип int, выражение &arr[0] (и с расширением arr) имеет тип int *.

В некоторых случаях, однако, это затухание не случилось.Одним из них является случай, когда массив является операндом оператора &.Таким образом, выражение &arr имеет тип int (*)[5], то есть указатель на массив размером int размера 5.

Что касается того, почему значения этих двух адресов совпадают, имеет смысл, если выпосмотрите на это:

                  arr 
                -------
0x7ffda0a04310  |  0  |
                -------
                |  0  |
                -------
                |  0  |
                -------
                |  0  |
                -------
0x7ffda0a04314  |  1  |
                -------
                |  1  |
                -------
                |  1  |
                -------
                |  1  |
                -------
                ...

Глядя на это, вы можете видеть, что сам массив и первый элемент массива начинаются с одного и того же адреса.

Итак arr (как выражение)имеет тип int *, в то время как &arr имеет тип int(*)[5], но оба имеют одинаковое значение.

0 голосов
/ 09 октября 2018

Это потому, что когда вы используете символ массива, он фактически оценивается как &arr (адрес первого элемента).Таким образом, arr и &arr имеют один и тот же адрес (но не тот же тип!).

arr имеет тип int*

&arr имеетвведите int(*)[5]

Разница заключается в том, когда вы делаете арифметику указателя.Инкремент arr перейдет по адресу следующего элемента.Так что *(arr+1) по сути то же самое, что и arr[1].Приращение &arr перебирает весь массив (при увеличении указателя всегда переходит весь размер типа)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...