В чем смысл следующего? - PullRequest
       5

В чем смысл следующего?

4 голосов
/ 06 апреля 2010
int sampleArray[] = {1,2,3,4,5};

Я понимаю, что sampleArray теперь указывает на первый элемент массива.

Однако, что это значит, когда я говорю &sampleArray? Означает ли это, что я получаю адрес переменной sampleArray? Или это означает переменную двумерного массива?

Итак, я могу сделать это:

int (*p)[5] = &sampleArray?

Ответы [ 5 ]

9 голосов
/ 06 апреля 2010

Нет, sampleArray на самом деле не указывает на первый элемент массива.sampleArray - это массив.

Путаница возникает из-за того, что в большинстве мест, где вы используете sampleArray, он будет заменен указателем на первый элемент массива.«Большинство мест» означает «где бы то ни было, что он не является операндом операторов sizeof или унарных - &».

Поскольку sampleArray является самим массивом и является операндом унар& является одним из мест, где он поддерживает эту индивидуальность, это означает, что &sampleArray является указателем на весь массив.

7 голосов
/ 06 апреля 2010

Имя массива соответствует его адресу (который является адресом его первого элемента), поэтому sampleArray и &sampleArray имеют одинаковое значение.

Однако они не имеют одинаковый тип:

  • sampleArray имеет тип int* (то есть указатель на int)
  • &sampleArray имеет тип int (*)[5] (то есть указатель на массив из пяти целых чисел).

int (*p)[5] объявляет указатель p на массив из пяти int с. Ergo,

int (*p)[5] = &sampleArray; // well-formed :)
int (*p)[5] = sampleArray;  // not well-formed :(
0 голосов
/ 06 апреля 2010

, что называется инсилизацией массива. массив - это набор данных подобного типа, например int, char, float number.

0 голосов
/ 06 апреля 2010

Пример кода:

#include <stdio.h>

int main()
{
  int a[] = {1,2,3,4,5};
  int (*p)[5] = &a; 
  //Note
  //int (*p)[5] = a; // builds (with warnings) and in this case appears to give the same result

  printf( "a = 0x%x\n" , (int *)a);
  printf( "&a = 0x%x\n", (int *)(&a));
  printf( "p = 0x%x", (int *)p);

  return;
}

Вывод - одинаковый для обоих способов.

$ ./a.exe 
a = 0x22cd10
&a = 0x22cd10
p = 0x22cd10

Компилятор

$ gcc - версия gcc (GCC) 3.4.4 (Cygming Special, GDC 0,12, используя DMD 0.125) Copyright (C) 2004 Free Software Foundation, Inc. Это бесплатно программного обеспечения; см. источник для копирования условия. Там нет гарантии; не даже для ТОРГОВЛИ или ФИТНЕСА ДЛЯ ОСОБЕННОЙ ЦЕЛИ.

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