2016-11-14 3 views
0

Во-первых, я новичок в программировании на С, и я хотел бы знать, как передать struct через функцию?Передача структуры функции C

Например:

typedef struct 
{ 
char name[20]; 
}info; 

void message() 
{ 
info n; 

printf("Enter your name : "); 
scanf("%s", &n.name); 
} 

И я хочу передать введенное имя в эту функцию, так что он будет печатать имя.

void name() 
{ 
printf("Good morning %s", ...); 
} 
+0

'scanf ("% s ", & p.name);' должно быть 'scanf ("% 19s ", n.name);' – mch

+1

Что в вашей книге C о прохождении параметров к функциям не ясно? – Olaf

ответ

3

Да, вы можете просто передать структуру по значению. Это создаст копию данных:

void name(info inf) 
{ 
    printf("Good morning %s", inf.name); 
} 

Создание на структуру которого только элемент массив (как вы это делали), является известным способом «передавать массивы по значению» (который обычно не возможно).

Для больших структур распространено просто передать указатель:

void name(info *inf) 
{ 
    printf("Good morning %s", inf->name); 
} 

Но изменения целевого указателя будут видны вызывающим абонент.

0

Ну, если вы просто хотите напечатать имя, вы можете передать указатель на строку.

void name(char *str) 
{ 
    printf("Good morning %s", str); 
} 

Вызывается, как name(n.name);

Но давайте предположим, что это упрощенный пример, и вы действительно хотите получить доступ ко всей структуры внутри функции. Обычно вы должны указывать указатель на структуру.

void name(info *ptr) 
{ 
    printf("Good morning %s", ptr->name); 
} 

Вызывается, как name(&n);

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

void name(info inf) 
{ 
    printf("Good morning %s", inf.name); 
} 

Вызывается, как name(n);

+0

Это не обязательно ** копирует параметр struct. Особенно, если вы объявите его 'const', компилятор может просто передать указатель без копирования, если наблюдаемое поведение будет одинаковым. – Olaf

1

Создать определение функции, которая принимает 'данные' (структура) в качестве параметра:

void name (info); 

Определить функцию как:

void name(info p) { 
    printf("Good morning %s", p.name); 
} 

Тогда выполните соответствующую функцию:

+0

Декларация не «создает» функцию. И это добавит значительную накладную для большой «структуры». – Olaf

Смежные вопросы