Что вы называете синтаксисом синтаксиса [*] в параметрах функции C? [Дубликат]

Что вам нужно, чтобы идентифицировать ваш домашний компьютер со всего Интернета, чтобы получить доступ извне.

Этот учебник поможет вам http://kyokasuigetsu25.wordpress.com/2011/ 01/21 / how-to-access-localhost-of-computers-outside-the-network /

Но если у вас есть только простые html-файлы (css, js too), вы можете использовать Dropbox и обмениваться папками ваших сайтов. Таким образом, вы можете работать локально, и файлы будут синхронизироваться с вашей общей папкой

Надеюсь, что это поможет

71
задан haccks 5 August 2016 в 14:09
поделиться

2 ответа

Какова его цель, почему она была добавлена?

Назначение видно, когда в качестве параметра функции используется двоичный размер переменной длины. Функция

int foo(int n, int m, int a[n][m])  {...}   

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

int foo(int , int, int [][*]);
int foo(int , int, int a[*][*]);
int foo(int , int, int (*a)[*]);
int foo(int n, int, int a[n][*]);
int foo(int , int m, int a[*][m]);
int foo(int , int m, int (*a)[m]);
int foo(int n, int m, int a[n][m]); 

. В случае двумерного массива, когда он используется как параметр функции, размер второго измерения может " t опустить. Если имя первых переменных в прототипе функции опущено, тогда было бы невозможно указать длину (второе измерение) массива. * дает понять, что длина массива будет определяться вторым параметром.

В чем разница с int[]? В чем разница с int *?

В случае 1D-массива для определения функции

int bar(int n, int a[n]} {...}  

допустим любой из следующих прототипов

int bar (int , int *);
int bar (int , int [*]);
Int bar (int , int []);
int bar (int n, int a[]);
int bar (int n, int a[n]);
int bar (int n, int [n]);   

В этом case * и n не требуется, поскольку компилятор будет рассматривать как int [*], так и int [n] как int *. Итак, с одномерным массивом вы не видите большой разницы.


ПРИМЕЧАНИЕ. При использовании массива переменной длины в качестве параметра функции важно указать параметр. Порядок параметров для первых четырех прототипов bar можно переключить, но в последних двух первых параметрах не должно быть самого массива.

int bar (int a[n], int n);  //Wrong. Compiler has not yet seen 'n'.
39
ответ дан haccks 16 August 2018 в 01:50
поделиться
  • 1
    Это напрямую отвечает на вопрос, а не просто цитирует стандарт. – alvits 4 August 2016 в 19:15
  • 2
    Стандартная цитата напрямую отвечает на вопрос, и это авторитетно, потому что это со стандарта. Нет ничего плохого в стандартных котировках. (Подумайте об этом, цитата из документа обоснования, а не стандарта).) – user2357112 4 August 2016 в 19:18
  • 3
    @ user2357112 был другой ответ не мной, который прямо цитировал «Стандарт». Я думаю, alvits отказывается от этого. Мой не цитирует стандарт C, как вы правильно указываете – Johannes Schaub - litb 4 August 2016 в 19:22
  • 4
    int bar (int [*], int); верен. – M.M 5 August 2016 в 04:30
  • 5
    Дело не в том, что есть что-то неправильное со ссылкой на стандарт, per se . На самом деле, это, как правило, хорошая идея. Проблема возникает, когда ответ состоит исключительно из цитаты из стандарта без каких-либо объяснений. Как правило, если кто-то смог прочитать и понять, что именно подразумевается под стандартом, они не будут задавать вопрос об этом в Stack Overflow. Поэтому хороший ответ (на вопрос, где он уместен) действительно должен сделать то и другое. Если бы вам пришлось выбирать тот или иной, мне пришлось бы согласиться с alvits и сказать, что объяснение превосходит цитату. – Cody Gray♦ 5 August 2016 в 04:38

В документе обоснования C для C99 указано

Прототип функции может иметь параметры, которые имеют типы массивов переменной длины (§6.7.5.2), используя специальный синтаксис, как в

int minimum(int, int [*][*]);

Это согласуется с другими прототипами C, где имя параметра не требуется указывать.


В чем разница с int []

В чем разница с int *.

I что эти типы в прототипе функции означают «указатель», а [*] в непервой позиции (int[*] по-прежнему равен int[], я думаю, что в прототипе функции) действительно и означает array

// not recommended though: it is now unclear what the parameters
// mean to human callers!
void f(int, int [][*]);

void f(int n, int x[][n]) {
    x[1][0] = 1;
}

int main() {
   int a[2][1];
   f(1, a);
   printf("%d\n", a[1][0]);
}

Что касается этой цели, то при индексировании массива в определении функции компилятор должен знать, сколько целых чисел следующего индекса пропустит при выдаче первого индекса ( x[i] пропускает i * n целые числа в f выше). Но эта информация не нужна в объявлении прототипа без определения, поэтому его можно оставить и заменить на *.

15
ответ дан Johannes Schaub - litb 16 August 2018 в 01:50
поделиться
  • 1
    Ваш прототип функции должен быть void f(int, int x[][*]). Когда вы даете первому параметру имя, тогда нет необходимости в *. Весь смысл этой функции заключается в том, что вы можете использовать старомодные прототипы функций, которые не называют параметры. – user3386109 4 August 2016 в 19:33
  • 2
    @ user3386109 hmm, называл параметры, которые не разрешены в C89? Я думал, что это всегда разрешено? Почему woud, оставляя имена, «старомодным»? Но, правда, мотивация менее высока, если вы все равно укажете параметр – Johannes Schaub - litb 5 August 2016 в 06:55
Другие вопросы по тегам:

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