Вопрос по поводу указателя в программе.[С] - PullRequest
2 голосов
/ 19 июля 2011

Вот полный код этого кода

#include <stdio.h>
#include <string.h>

void reverse_string(unsigned short *buf, int length)
{
    int i;
    unsigned short temp;

    for (i = 0; i < length / 2; i++)
    {
        temp = buf[i];
        buf[i] = buf[length - i - 1];
        buf[length - i - 1] = temp;
    }   
}

int main(int argc, char **argv)
{
    unsigned short* tmp = (unsigned short*)argv[1];
    reverse_string(tmp,strlen(argv[1]) / 2);

    printf("%s",argv[1]);

    return 0;   
}

Как вы можете видеть, в основном у нас есть

unsigned short* tmp = (unsigned short*)argv[1];

Указатели Arent, которые должны указывать «на адрес» изПеременная?Тот, что выше, не (используя амперсанд).И все же программа работает так, как задумано.

Почему это так?

И что означает эта часть?

(unsigned short*)argv[1]

Ответы [ 3 ]

6 голосов
/ 19 июля 2011

argv - указатель на массив указателей:

  • argv[0][0] (a char)
  • argv[0] (a char*)
  • argv (char**)

    unsigned char* tmp = (unsigned char*)argv[1];

... работает, потому что вы ссылаетесь на вторую "строку" в этом наборе.

Обратите внимание, что в этом случае "char" и "unsigned short" могут быть примерно приблизительно эквивалентными в зависимости от компилятора и платформы, но, вероятно, не стоит это предполагать Например, если вы скомпилировали, чтобы включить командную строку «Юникод», то вы можете получить «short» вместо «char», перенаправленный вам из командной строки. Но это может быть опасным допущением, поскольку «в наши дни» «short» обычно составляет 16 битов, а «char» обычно составляет 8 битов.

0 голосов
/ 20 июля 2011

Обращение к исходным вопросам:

argv - это массив указателей, каждый из которых указывает на массив символов.argv[1] - указатель на массив символов с первым аргументом (т. Е. При запуске ./program arg1 arg2 указатель argv[1] указывает на строку arg1).

Амперсанд используется для обозначенияссылка, которая для большинства целей совпадает с указателем.Это синтаксический сахар, облегчающий передачу ссылки на переменную, которую вы уже объявили.Типичным примером является использование scanf.

int x = 1;
scanf(..., &x, ...)

эквивалентно

int x = 1;
int *p = &x;
scanf(..., p, ...)

Сама программа предназначена для отражения порядка байтов.Недостаточно переходить от символа к символу, потому что нужно переворачивать два байта за раз (то есть за коротким коротким замыканием), поэтому он работает с использованием шорт.

(unsigned short*)argv[1] указывает компилятору обрабатывать адрес, как если бы он был массивом шортов.Для примера:

unsigned char *c = (unsigned char *)argv[1];
c[1]; /*this points to the address one byte after argv*/
unsigned short *s = (unsigned short *)argv[1];
s[1]; /*this points to the address two bytes after argv */
0 голосов
/ 19 июля 2011

Взгляните на учебник по литью .

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