Разница между указателем с массивом и (* p) [5] [duplicate]

Angular1

Для людей, которые используют AngularJS , может справиться с этой ситуацией, используя Promises.

Здесь it говорит,

Обещания могут использоваться для отключения асинхронных функций и позволяют объединять несколько функций вместе.

Вы можете найти приятное объяснение здесь .

Пример, найденный в docs , упомянутом ниже.

  promiseB = promiseA.then(
    function onSuccess(result) {
      return result + 1;
    }
    ,function onError(err) {
      //Handle error
    }
  );

 // promiseB will be resolved immediately after promiseA is resolved 
 // and its value will be the result of promiseA incremented by 1.

Angular2 and Later

In Angular2, посмотрите на следующий пример, но его рекомендовал использовать Observables с Angular2.

 search(term: string) {
     return this.http
  .get(`https://api.spotify.com/v1/search?q=${term}&type=artist`)
  .map((response) => response.json())
  .toPromise();

}

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

search() {
    this.searchService.search(this.searchField.value)
      .then((result) => {
    this.result = result.artists.items;
  })
  .catch((error) => console.error(error));
}

См. здесь оригинал . Но TypScript не поддерживает native es6 Promises , если вы хотите его использовать, для этого вам может понадобиться плагин.

Кроме того, здесь представлены обещания spec определите здесь.

422
задан akashchandrakar 12 December 2014 в 07:12
поделиться

10 ответов

int* arr[8]; // An array of int pointers.
int (*arr)[8]; // A pointer to an array of integers

Третий тот же, что и первый.

Общее правило - приоритет оператора . Это может стать еще более сложным, поскольку указатели на функцию попадают в изображение.

400
ответ дан Mehrdad Afshari 22 August 2018 в 10:37
поделиться
  • 1
    Итак, для 32-битных систем: int * arr [8]; / * 8x4 байт, для каждого указателя / int (* arr) [8]; / выделено 4 байта, только указатель * / – George 13 May 2009 в 19:43
  • 2
    Неа. int * arr [8]: 8x4 байт выделено total , по 4 байта для каждого указателя. int (* arr) [8] прав, 4 байта. – Mehrdad Afshari 13 May 2009 в 19:49
  • 3
    Мне следовало перечитать то, что я написал. Я имел в виду 4 для каждого указателя. Спасибо за помощь! – George 13 May 2009 в 19:59
  • 4
    Причина, по которой первая такая же, как и последняя, ​​состоит в том, что ей всегда разрешено обертывать круглые скобки вокруг деклараторов. P [N] - это декларатор массива. P (....) является декларатором функции, а * P - декларатором указателя. Таким образом, все в следующем то же самое, что и без круглых скобок (кроме одной из функций «& quot; ()»: int (((* p))); void ((g (void))); int * (a [1]), void (* (p ())). – Johannes Schaub - litb 13 May 2009 в 21:21
  • 5
    +1 За хорошо написано опорной ссылки. Другие статьи на этом сайте тоже стоит знать. – RBerteig 14 May 2009 в 02:41

Ответ за последние два также можно вычесть из золотого правила в C:

Декларация следует за использованием.

int (*arr2)[8];

Что произойдет, если вы разыграете arr2? Вы получаете массив из 8 целых чисел.

int *(arr3[8]);

Что произойдет, если вы возьмете элемент из arr3? Вы получаете указатель на целое число.

Это также помогает при работе с указателями на функции. Чтобы взять пример сигуиса:

float *(*x)(void )

Что происходит, когда вы разыскиваете x? Вы получаете функцию, которую вы можете вызвать без аргументов. Что происходит, когда вы это называете? Он вернет указатель на float.

Однако приоритет оператора всегда сложный. Однако использование круглых скобок также может быть путаным, поскольку декларация следует за использованием. По крайней мере, для меня интуитивно arr2 выглядит как массив из 8 указателей на ints, но на самом деле это наоборот. Просто привыкает. Разум достаточно, чтобы всегда добавлять комментарии к этим объявлениям, если вы спросите меня:)

edit: example

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NUM_ELEM(ar) (sizeof(ar) / sizeof((ar)[0]))

int *
put_off(const int newrow[2])
{
    static int mymatrix[3][2];
    static int (*rowp)[2] = mymatrix;
    int (* const border)[] = mymatrix + NUM_ELEM(mymatrix);

    memcpy(rowp, newrow, sizeof(*rowp));
    rowp += 1;
    if (rowp == border) {
        rowp = mymatrix;
    }

    return *rowp;
}

int
main(int argc, char *argv[])
{
    int i = 0;
    int row[2] = {0, 1};
    int *rout;

    for (i = 0; i < 6; i++) {
        row[0] = i;
        row[1] += i;
        rout = put_off(row);
        printf("%d (%p): [%d, %d]\n", i, (void *) rout, rout[0], rout[1]);
    }

    return 0;
}

Выход:

0 (0x804a02c): [0, 0]
1 (0x804a034): [0, 0]
2 (0x804a024): [0, 1]
3 (0x804a02c): [1, 2]
4 (0x804a034): [2, 4]
5 (0x804a024): [3, 7]

Обратите внимание, что значение границы никогда не изменяется, поэтому компилятор может оптимизировать это. Это отличается от того, что вы изначально хотели бы использовать: const int (*border)[3]: объявляет границу как указатель на массив из 3 целых чисел, которые не будут изменять значение до тех пор, пока существует переменная. Однако этот указатель может указывать на любой другой такой массив в любое время. Вместо этого мы хотим такого поведения для аргумента (потому что эта функция не меняет ни одного из этих целых чисел). Декларация следует за использованием.

(стр. См .: не стесняйтесь улучшать этот образец!) [/ ​​G14]

14
ответ дан 3 revs 22 August 2018 в 10:37
поделиться

Я думаю, что мы можем использовать простое правило.

example int * (*ptr)()[];
start from ptr 

"ptr - это указатель на« идти вправо ... »)« теперь идите налево »(« придите » out go right "()" so "для функции, которая не принимает аргументов« go left »и возвращает указатель« go right »в массив« go left »из целых чисел«

2
ответ дан akjoshi 22 August 2018 в 10:37
поделиться
typedef int (*PointerToIntArray)[];
typedef int *ArrayOfIntPointers[];
5
ответ дан Byron Formwalt 22 August 2018 в 10:37
поделиться
int *a[4]; // Array of 4 pointers to int

int (*a)[4]; //a is a pointer to an integer array of size 4

int (*a[8])[5]; //a is an array of pointers to integer array of size 5 
24
ответ дан gary 22 August 2018 в 10:37
поделиться
  • 1
    Не должен быть третий: a - массив указателей на целочисленный массив размером 8? Я имею в виду, что каждый из целых массивов будет иметь размер 8 справа? – Rushil 2 May 2012 в 08:47
  • 2
    @Rushil: нет, последний индекс ([5]) представляет внутреннее измерение. Это означает, что (*a[8]) является первым измерением и, таким образом, является внешним представлением массива. Каждый элемент внутри a указывает на - это другой целочисленный массив размера 5. – zeboidlund 25 January 2013 в 19:19
  • 3
    Спасибо за третью. Я ищу, как написать массив указателей на массив. – Deqing 6 August 2013 в 15:39

Я не знаю, имеет ли оно официальное имя, но я называю это Right-Left Thingy (TM).

Начните с переменной, затем идите вправо, влево и вправо. .. и т. д.

int* arr1[8];

arr1 - это массив из 8 указателей на целые числа.

int (*arr2)[8];

arr2 - указатель (блок скобок справа налево) к массиву из 8 целых чисел.

int *(arr3[8]);

arr3 - это массив из 8 указателей на целые числа.

Это должно помочь вам со сложными объявлениями.

117
ответ дан GManNickG 22 August 2018 в 10:37
поделиться
  • 1
    Я слышал, что это называется именем «Спиральное правило», которое можно найти здесь здесь . – fouric 27 May 2013 в 04:04
  • 2
    @InkBlend: правило спирали отличается от правого правого правила . Прежний не работает в таких случаях, как int *a[][10], а последний преуспевает. – legends2k 9 October 2013 в 14:51
  • 3
    @dogeen Я думал, что этот термин имеет какое-то отношение к Бьярне Страуструпу :) – Anirudh Ramanathan 21 November 2013 в 08:52
  • 4
    Как сказано в InkBlend и legendends2k, это Spiral Rule, которое является более сложным и не работает во всех случаях, поэтому нет оснований для его использования. – kotlomoy 25 September 2014 в 19:29
  • 5
    Не забывайте левую и правую ассоциативность ( ) [ ] и справа налево от * & – Mushy 23 September 2017 в 14:10

Как правило, правые унарные операторы (например, [], () и т. д.) предпочитают более левые. Таким образом, int *(*ptr)()[]; будет указателем, который указывает на функцию, которая возвращает массив указателей на int (как можно скорее получить правильные операторы, когда вы выйдете из скобки)

2
ответ дан Luis Colorado 22 August 2018 в 10:37
поделиться

В указателе на целое число, если указатель увеличивается, он переходит в следующее целое число.

в массиве указателя, если указатель увеличивается, он переходит к следующему массиву

-7
ответ дан Nikhil 22 August 2018 в 10:37
поделиться
  • 1
    & lt; в массиве указателя, если указатель увеличивается, он переходит к следующему массиву & quot; это просто неправильно. – alk 25 August 2017 в 13:02

Я предполагаю, что вторая декларация вводит в заблуждение многих. Вот простой способ понять это.

Позволяет иметь массив целых чисел, т. Е. int B[8].

Давайте также будем иметь переменную A, которая указывает на B. Теперь значение в A является B, т. е. (*A) == B. Следовательно, A указывает на массив целых чисел. В вашем вопросе arr похож на A.

Аналогично, в int* (*C) [8] C является указателем на массив указателей на целое число.

2
ответ дан nishantbhardwaj2002 22 August 2018 в 10:37
поделиться

Используйте программу cdecl , как предложено K & amp; R.

$ cdecl
Type `help' or `?' for help
cdecl> explain int* arr1[8];
declare arr1 as array 8 of pointer to int
cdecl> explain int (*arr2)[8]
declare arr2 as pointer to array 8 of int
cdecl> explain int *(arr3[8])
declare arr3 as array 8 of pointer to int
cdecl>

Это работает и наоборот.

cdecl> declare x as pointer to function(void) returning pointer to float
float *(*x)(void )
249
ответ дан Nisse Engström 22 August 2018 в 10:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: