char **s
- это двумерный массив символов или массив строк C, если хотите.
Если вы хотите использовать массив символов, вы должны использовать:
char *string = (char*)malloc( 11 *sizeof(char));
Если вы действительно хотите инициализировать массив строк, на первом этапе вы инициализируете массив указателей, это:
char **s = (char**)malloc( 11 *sizeof(char *));
Обратите внимание, что я использую char *
внутри sizeof. Чем когда вы можете использовать строки, но сначала вы должны инициализировать каждую строку.
s[0] = (char*) malloc( 15*size(char)); // This is actually string, 14 characters long (NULL terminated)
char *p = s[0]; // p is pointer to beginning of your string now
И есть два способа адресации вашей строки:
s[0][3] // 4th character of your string
p[3]
Или, если вы хотите использовать только указатели:
char *p = *(s+0);
*(p+3); // 4th character
*((*(s+0))+3) // To do it "hardcore"
РЕДАКТИРОВАТЬ: добавил пример
Если у вас есть **char p
и вы используете p++
или p + 1
, C увеличивает адрес памяти. Оператор *p
сообщает компилятору, что теперь вы хотите работать с данными, хранящимися в памяти, а не с указателем. Поэтому эти два синтаксиса делают то же самое:
p[10] = 'a';
*(p+10) = 'a';
Итак, если вы хотите пересечь оба ваших измерения, вы должны использовать:
for( int i = 0; i < 11; i++){
char *p = *(s+i);
for( int j = 0; j < 10; j++){
*(p + j) = 'a'; // Say you wanna fill them with as
}
// You may also use this syntax:
while( p < (*(s+i) + 10)){ // or use != instead of <
*p = 'a';
p++;
}
}