char *string
- указатель на массив char
.что-то вроде этого:
.----. .----. .----.
| s | - | a | - | m |
.----. .----. .----.
^
|
char *string --.
все равно, что у вас есть массив и указатель на массив:
char strArr[3];
char *ptrToStr = &strArr;
вы можете инициализировать char *
различными способами:
char *string;
scanf("%as", string);
/* if you don't allocate buffer for `*string`, and specify "a" in string format,
then `scanf` will do it for you. this is GNU-only extension. */
char *string2;
string2 = (char *) malloc (BUFF_SIZE);
sprintf(string2, "%s" , "Ghasem Ramezani");
...
Но char **string
- это указатель на указатель на char
массив .что-то вроде этого:
.----. .----. .----.
| s | - | a | - | 1 |
.----. .----. .----.
^
|
.-> char *string --.
| .----. .----. .----.
| | s | - | a | - | 2 |
| .----. .----. .----.
| ^
| |
.-> char *string2 --.
|
.-------------.
|
char **strArr ---.
например, char **
, вы помните аргумент argv
в main ()
?это точно тип char **
.давайте рассмотрим пример:
/*1*/ #include <stdio.h>
/*2*/ int main(int argc, char *argv[]) {
/*3*/ for (int i = 0; i < argc; ++i)
/*4*/ puts(argv[i]);
/*5*/ return 0;
/*6*/ }
$> gcc -o output main.c
$> ./output ghasem ramezani
./output
ghasem
ramezani
$>
, как вы можете видеть в строке 2, мы можем написать char *[]
вместо char **
.Зачем ?потому что, как я и @Kevin сказали:
Считайте const char ** как «(неконстантный) указатель на (не константный) указатель на постоянный символ».