1) Ναι. Οι πίνακες ουσιαστικά είναι δείκτες σε θέσεις μνήμης. Για παράδειγμα, αν τρέξεις το παρακάτω:
array[0] = 1;
*(p+1) = 2; //Next address of the pointer
array[2] = 3;
printf("Pointer address: %d\n", p);
printf("Array [0] = %d, Array [1] = %d and Array [2] = %d\n",
array[0], *(p+1), *(array + 2));
θα πάρεις
Pointer address: 1398491568
Array [0] = 1, Array 1 = 2 and Array [2] = 3
2) Δεν είμαι σίγουρος ότι καταλαβαίνω την ερώτηση. Ένα string είναι ένας πίνακας με χαρακτήρες με τελευταίο χαρακτήρα το \0
. Αρα ναι μπορείς να κάνεις κάτι σαν αυτό που (φαντάζομαι ότι) ρωτάς:
char s[12] = "Hello\0";
char *ps = s;
printf("%s\n", ps+1);
και να πάρεις
ello
3) Η παράμετρος έιναι δείκτης σε ένα πίνακα με δείκτες σε χαρακτήρες. Ουσιαστικά μπορείς να το σκεφτείς και σαν έναν δισδιάστατο πίνακα. Η μορφή της θα είναι κάπως έτσι (με όνομα προγράμματος prog):
*argv[] ---> argv[0] argv1
|
v
p
r
(δεν ξέρω αν το visualisation βοήθησε. :Ρ
4) Well θα μπορούσες να το κάνεις αυτό, αλλά όχι ακριβώς έτσι. Όταν αρχικοποιείς ένα πίνακα η C(++) περιμένει μια σταθερή έκφραση. Άρα το πρόγραμμα, αν γράψεις το παραπάνω θα σου πετάξει ένα error στο compile time error: invalid initializer
. Αν πραγματικά ήθελες να το κάνεις με αυτό τον τρόπο θα έπρεπε να κάνεις copy το string (π.χ με strcpy). Μπορείς να δείς εδώ μια αντίστοιχη ερώτηση.
5) Δεδομένου ότι δεν μπορείς να κάνεις την παραπάνω αντικατάσταση, θα αναφερθώ απλά στο type casting, την μετατροπή τύπου από char σε int, το οποίο η C(++) σε αφήνει να κάνεις, βγάζοντας σου μόνο ένα warning, αν π.χ. κάνεις
int *arg_1 = argv[0];
warning: initialization of ‘int *’ from incompatible pointer type ‘char *’ [-Wincompatible-pointer-types]
int *arg_1 = argv[0];
Αυτό όμως είναι πολύ κακή πρακτική (εξού και το warning), αφού κάνει τον κώδικα δύσκολο στην διατήρηση, και δύσκολο στην ανάγνωση.
Αν πραγματικά ήθελες να κάνεις μετατροπή σε άλλο τύπο θα μπορούσες να το κάνεις explicitly, αλλά νομίζω αυτό ξεφεύγει από τα όρια της ερώτησης.
Edit:
Πρόσθεσα ένα λίγο πιο κατατοπιστικό παράδειγμα στην ερώτηση 1.