2013-06-16 16 views
18

Kiedy jestem przechodzącej ciąg do funkcji czasami używamPrzekazywanie ciągów do funkcji w C - z wskaźnikami lub bez?

char *functionname(char *string name[256]) 

i czasami używam go bez wskaźników (na przykład:

char functionname(char string[256]) 

Moje pytanie brzmi, kiedy muszę korzystać wskaźniki? Często piszę programy bez wskazówek i działa, ale czasami nie.

+1

Co robić masz na myśli, że "czasami to działa, a czasami to nie robi"? – Anickyan

+6

Musisz przeczytać podstawowy samouczek, mój przyjaciel. – Maroun

+1

Proszę, nie zmuszaj nas do zgadywania. Pokaż swój kod. Wystarczy, abyśmy zrozumieli problem. –

Odpowiedz

29

Przyjęta konwencja przechodząc C-ciągi do funkcji jest użycie wskaźnika:

void function(char* name) 

Gdy funkcja modyfikuje ciąg należy również przekazać w długości:

void function(char* name, size_t name_length) 

Twoja pierwsza Przykład:

char *functionname(char *string name[256]) 

przechodzi tablicę wskaźników do strun, które nie jest to, czego potrzebujesz w wszystko.

drugim przykładzie:

char functionname(char string[256]) 

przechodzi szereg znaków. Wielkość tablicy tutaj nie ma znaczenia, a parametr ulegnie rozpadowi do wskaźnika tak, więc jest to równoznaczne z:

char functionname(char *string) 

Zobacz także this question więcej szczegółów na temat argumentów tablicy w C

+0

Czy istnieje jakakolwiek szkoda, jeśli funkcja odbiera ciąg znaków w następujący sposób: char nazwa_funkcji (ciąg znaków [256]) –

+0

'funkcja void (char * name) 'ma zatem zastosowanie tylko wtedy, gdy nie modyfikuje łańcucha C? Czy nie miałoby sensu ogłaszać go "const"? Co do większości, wysyłasz wskaźnik, który powinien być również const, ponieważ nie zmienisz samego wskaźnika? – Paul

+0

'char * functionname (char * string name [256])' jest błędem składni, a nie "podaje tablicę wskaźników". –

0

tablica jest wskaźnikiem. wskazuje to na początku sekwencji „obiektów”.

Jeśli to zrobimy: ìnt arr[10];, wówczas arr jest wskaźnikiem do miejsca w pamięci, z którego wynika dziesięć liczb całkowitych. Są niezainicjowane, ale pamięć jest przydzielona. Dokładnie tak samo jak w przypadku int *arr = new int[10];.

+0

#include #include void StringSort (char S [5] [30 ]); void main() { \t char S [5] [30]; \t int i; \t printf ("Unesi 5 stringova: \ n"); \t dla (i = 0; i <5; i ++) \t dostaje (S [i]); \t printf ("\ nUneseni stringovi su: \ n"); \t dla (i = 0; i <5; i ++) \t \t puts (S [i]); \t StringSort (S); \t printf ("\ nStringovi sortirani po broju znakova su: \ n"); \t dla (i = 0; i <5; i ++) \t \t puts (S [i]); } void StringSort (char S [5] [30]) { \t char pS [30]; \t int i, j; \t for (i = 0; i <4; i ++) \t \t for (i = i + 1, j <5 j ++) \t \t \t if (strlen (I [i])> strlen (S [ j])) \t \t \t { \t \t \t \t strcpy (ps s [i]); \t \t \t \t strcpy (S [i], S [j]); \t \t \t \t strcpy (S [j], pS); \t \t \t} –

+2

Tablica jest * nie * wskaźnikiem. na przykład 'sizeof (arr)' jest inne dla tablicy i wskaźnika. A 'new' to C++, a nie C. – interjay

+0

@interjay, przepraszam. Nie myślałem o tym. Możesz oczywiście użyć funkcji malloc(). – Anickyan

1

Zakładając, że masz na myśli napisać

char *functionname(char *string[256]) 

Tutaj jesteś deklarując funkcję, która pobiera tablicę wskaźników do 256 char jako argument i zwraca wskaźnik do char. Tutaj, z drugiej strony,

char functionname(char string[256]) 

Jesteś deklarując funkcję, która pobiera tablicę 256 char s jako argument i zwraca char.

Innymi słowy, pierwsza funkcja pobiera tablicę ciągów znaków i zwraca ciąg, a druga ciąg znaków i zwraca znak.

Powiązane problemy