Δημοσιεύτηκε: 25 Ιουν 2012, 19:42
από migf1
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 );
}