Δημοσιεύτηκε: 25 Ιουν 2012, 19:42
g1wrg0s έγραψε:H εντολη που γραφεις argv[1] +2 δεν θα επιστρεψει διευθυνση; και πιο συγκεκριμενα την διευθυνση του τριτου δεικτη του πινακα argv; Οχι το 4 ως αλφαριθμιτικο οπως αναφερεις ετσι δεν ειναι;
Σωστά το αναφέρει ο οδηγός.
Για να μας επιστρέψει την διεύθυνση του 3ου string στον πίνακα *argv[] θα έπρεπε να γράφαμε...
- Μορφοποιημένος Κώδικας: Επιλογή όλων
-
argv+2
Έστω ότι...
- Μορφοποιημένος Κώδικας: Επιλογή όλων
-
char *strarr[] = { "1", "10", "100", "1000" }
τότε ισχύει (τα == στην αριστερή μεριά είναι συντμήσεις της 0 == strcmp(), δεξιά ισχύουν ατόφια) ...
*strarr == strarr[0] == "1" και strarr == &strarr[0]
*(strarr+1) == strarr[1] == "10" και (strarr+1) == &strarr[1]
*(strarr+2) == strarr[2] == "100" και (strarr+2) == &strarr[2]
*(strarr+3) == strarr[3] == "1000" και (strarr+3) == &strarr[3]
Ανεξάρτητα με αυτά, να συμπληρώσω πως ο *argv[] είναι πάντα NULL terminated, οπότε το παρακάτω δεν κρασάρει ποτέ...
- Μορφοποιημένος Κώδικας: Επιλογή όλων
-
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char *argv[] )
{
while ( *argv )
puts( *argv++ );
exit( 0 );
}
Τέλος να συμπληρώσω και την ύπαρξη 3ου ορίσματος της main(), του char **envp, το οποίο δεν είναι στάνταρ C αλλά υποστηρίζεται από το runtime των περισσοτέρων δημοφιλών πλατφορμών (windows, posix > 1.x, mac-osx).
Όπως και το char **argv, έτσι κι αυτό είναι ένας NULL terminated πίνακας από strings, που περιέχει τις μεταβλητές περιβάλλοντος.
Δοκιμάστε π.χ. τον παρακάτω κώδικα...
- Μορφοποιημένος Κώδικας: Επιλογή όλων
-
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char *argv[], char *envp[] )
{
while ( *envp )
puts( *envp++ );
exit( 0 );
}