Инициализировать массив символов с помощью указателей - PullRequest
1 голос
/ 22 января 2012

Эта проблема сводит меня с ума, я уверен, что что-то упустил. Мне нужно инициализировать массив символов, используя только указатели. Ниже приведен код, который у меня есть:

    int p2(){
         /* Implements problem 2 of lab */

         // Create an array 
         char **s = (char**)malloc( 11 *sizeof(char));
         char *p = *s;
         char start ='A';

         while( p != s+10){
            *p = start;
            start++;
            p++;
         }

         return(0);
    }

Проблема у меня в том, что я не знаю, как обращаться с символами внутри массива. Я понимаю, что базовый адрес массива - ** s, а указатель на первый элемент - * s. Чего я не понимаю, так это как получить ** s + 10 (то есть конец массива).

Кто-нибудь может пролить немного света на меня ??? Пожалуйста! * * 1006

РЕДАКТИРОВАТЬ: Хорошо, похоже, я неправильно понял вопрос. Мне кажется, мне нужно создать массив строк (таким образом, распределение символов **). Затем мне нужно перебрать этот массив и присвоить каждой строке (то есть char *) значение длиной 15 символов. Пожалуйста, дайте мне знать, если я правильно понимаю:

char ** strings ==> strings [0 ... n], где каждый элемент является указателем на символ (возможно, массив). Там для * string ==> strings [0], * (string + 1) = strings [1] и т. Д. И т. Д.

Я близко или далеко?

Ответы [ 5 ]

4 голосов
/ 22 января 2012

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++;
    }
}
2 голосов
/ 22 января 2012

I думаю вы имели в виду это:

     char *s = (char*) malloc(11 *sizeof(char));
     char *p = s;

В этом случае вы будете обращаться к символам с s[x]

1 голос
/ 22 января 2012

Почему вы должны использовать двойной указатель для создания массива символов?

char *s = (char *) malloc(10 * sizeof(char));
char *start = s; // save starting pointer

for(; s < start+10; s++)
    *s = 'a';

return 0;

Если вы выделяете char **, по существу, вы выделяете массив указателей на char (например, массив строк). Если вам нужен массив символов, выделите массив символов. Если вы начинаете работать с указателями, дизайн стека и кучи может быть очень полезным.

0 голосов
/ 22 января 2012

Код здесь разваливается.

char **s = (char**)malloc( 11 *sizeof(char));

Вы выделяете достаточно памяти на 11 char с, что звучит как то, что вы хотите сделать.

Однако выВы преобразуете адрес для этих 11 char s в (char**), как если бы вы выделяли место для указателей, а не char s.

0 голосов
/ 22 января 2012

Во-первых, вам не нужно char **, если вам не нужен массив массивов.

Во-вторых, вы можете добраться до конца массива с помощью (*s)[10] или *((*s)+10)

В-третьих, в программировании на С не приводите результат malloc()

...