разыменование массива - PullRequest
       6

разыменование массива

2 голосов
/ 20 августа 2010

Использование gcc 4.4.3 c89:

Я просто работаю над следующим кодом:

У меня просто есть несколько вопросов по разыменованию указателя src.Который объявлен в вызывающей функции как:

char src[] = "device_id";

Моя путаница заключается в разыменовании src:

for(i = 0; src[i] != '\0'; i++) {
    printf("src %d: [ %s ]\n", i,  &src[i]);
}

src распался на указатель.Таким образом, src будет указывать на первый элемент в массиве, который будет символом d:

src -> "device_id"

Поэтому, когда я делаю это src[i], я разыменую значение, чтобы он возвращал текущий символуказывая на.В этом примере, когда он доберется до nul, он выйдет из цикла for.

For example i = 0

Для &src[i] получаю ли я адрес символа вместо самого символа?Так что если src[i] будет разыменовываться и возвращать d, &src[i] будет возвращать адрес d.

Поскольку *dest[] является массивом указателей на символы, он ожидает адрес.Итак, здесь я назначаю адрес символа массиву указателей на char.

dest[i] = &src[i];

Есть ли разница в выполнении этого в функции printf для% s при использовании либо &src[i], либо src[i]:

printf("src %d: [ %s ]\n", i,  &src[i]);

или

printf("src %d: [ %s ]\n", i,  src[i]);

Исходный код:

void inc_array(char *src, size_t size)
{
    /* Array of pointers */
    char *dest[size];
    size_t i = 0;

    memset(dest, 0, size * (sizeof char*));

    /* Display contents of src */
    for(i = 0; src[i] != '\0'; i++) {
        printf("src %d: [ %s ]\n", i,  &src[i]);
    }

    /* copy contents to dest */
    for(i = 0; i < 9; i++) {
        dest[i] = &src[i];
    }

    /* Display the contest of dest */
    for(i = 0; *dest[i] != '\0'; i++) {
        printf("dest %d: [ %s ]\n", i, dest[i]);
    }
}

Большое спасибо за любые предложения,

Ответы [ 3 ]

2 голосов
/ 20 августа 2010

Спецификатор формата% s хочет вставить строку, поэтому если вы передадите ей & src [i], она начнется с i-го символа src и будет печататься до нулевого терминатора. Вы почти наверняка захотите% c вместо% s и src [i] вместо & src [i].

2 голосов
/ 20 августа 2010

Для &src[i] я получаю адрес персонажа вместо самого персонажа? Так, где src[i] будет разыскивать и возвращать d, &src[i] будет возвращать адрес d.

src[i] эквивалентно *(src + i), поэтому &src[i] совпадает с &*(src + i), что может быть уменьшено до src + i. Он просто выполняет арифметику с указателями, и разыменование не происходит.

src[i] дает вам символ в src с индексом i, а &src[i] дает вам указатель на i-й символ в src.

1 голос
/ 20 августа 2010

Да, есть разница.&src[i] - это адрес символа в src[i], как вы правильно сказали.src[i] - это сам символ.

Как для печати с "%s", так и для назначения char * объекта, &src[i] - правильная формулировка.

(Кстати, &src[i] также можно записать как src + i, если хотите).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...