C - (ptr = = & ptr) Что такое * ptr? - PullRequest
3 голосов
/ 18 ноября 2010

Это может быть глупый вопрос, но у меня небольшая проблема с пониманием указателей Си Еще больше, когда речь идет о массивах. Например:

char ptr[100];
ptr[0]=10;

fprintf(stderr, "&ptr: %p \n ptr: %p \n*ptr: %d\n", &ptr, ptr, *ptr);

if ( &ptr == ptr ) {
  fprintf(stderr, "Why?\n");
}

Как это вообще возможно? 'ptr' находится по адресу & ptr. И содержание ptr такое же, как & ptr. Тогда почему * ptr = 10 ???

Ответы [ 3 ]

5 голосов
/ 18 ноября 2010

Адрес первого элемента массива совпадает с адресом самого массива.

За исключением случаев, когда это операнд операторов sizeof или address-of & или строковый литерал, используемый для инициализации другого массива в объявлении, выражение типа "массив N-элементов"T "будет неявно преобразован (" распад ") в тип" указатель на T ", а значение будет адрес первого элемента в массиве.

Если выражение a имеет тип "N-элементный массив T", то выражение &a является типом "указатель на N-элементный массив T" или T (*)[N].

Учитывая объявление

T a[N];

, тогда выполняются все следующие условия:

Expression         Type        Decays to
----------         ----        ---------
         a         T [N]       T *
        &a         T (*)[N]    n/a
        *a         T           n/a

Выражения a и &a оба имеют одинаковые значения значение (расположение первого элемента в массиве), но имеет разные типы (указатель на T и указатель на массив T соответственно).

3 голосов
/ 18 ноября 2010

ptr (который, как говорит sbi, действительно является массивом) уменьшается до &(ptr[0]) (char * до первого элемента)

Это тот же адрес, что и &ptr (char (*) []), даже если они разных типов.

0 голосов
/ 18 ноября 2010
    int arr[5];
    arr[0]= 7;

    fprintf(stdout,"%p %p %d",&arr[0],arr,*arr);

    if( (int)&arr == (int)arr ) printf("good\n");
    else printf("bad\n");
    return 0;

}

Это будет работать ....

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