2016-12-24 7 views
2
#include<stdio.h> 

int main(void) 
{ 
    int arr[5]={1,2,3,4,5}; 
    int (*ptr)[5]=&arr; 

    printf("ptr=%p\n",ptr); i am not getting the diff btw both statements 
    printf("*ptr=%p\n",*ptr); 

    return 0; 
} 

output:- 
ptr=0xbf8f8178 
*ptr=0xbf8f8178 

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

+0

[Этот мой почтовый ящик] (https://ghost.pileborg.se/2016/08/28/the-difference-between-arrays-decaying-to-pointers-and-pointers-to-arrays/), надо надеяться, немного разобраться. Обратите внимание, что происходит, когда вы используете арифметику указателя на указателях, где разница между двумя указателями станет очень заметной. –

+0

Получил ответ, спасибо – sam1006

+0

Оба являются неопределенным поведением, '% p' требует' void * ' –

ответ

0

первый указатель в Printf является указателем на указатель

второй указатель в Printf указывает на первый элемент, на который указывает первый указатель

но типы двух указателей отличаются

enter image description here

видеть это изображение

источник: https://www.eskimo.com/~scs/cclass/int/sx9b.html

0

Два указателя имеют одинаковый адрес, но имеют разные типы.

ptr является указателем на массив из 5 целых чисел.

*ptr - это массив из 5 цепей. Однако, когда выражение типа «массив Т» используется в любом контексте, кроме sizeof или &, оно автоматически преобразуется в выражение типа «указатель на Т», указывая на первый элемент массива. В этом случае он становится указателем на int.

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