关于程序中指针的问题。 [C]

时间:2011-07-19 17:11:35

标签: c pointers

以下是它的完整代码

#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;   
}

正如你所看到的那样,在main中,我们有

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

Arent指针应该指向“变量的地址”?上面的那个不是(使用&符号)。然而,该计划按预期工作。

为什么会这样?

这部分是什么意思?

(unsigned short*)argv[1]

3 个答案:

答案 0 :(得分:6)

argv是一个指向数组的指针:

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

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

...有效,因为您正在引用该集合中的第二个“字符串”。

请注意,在这种情况下,“char”和“unsigned short可能大致等效,具体取决于编译器和平台,但这可能不是一个好主意假设。例如,如果编译为启用“unicode”命令行,则可能会从命令行向您转发“short”而不是“char”。但是,这可能是一个危险的假设,因为“这些天”“short”通常是16位而“char”通常是8位。

答案 1 :(得分:0)

查看type casting上的入门读物。

答案 2 :(得分:0)

解决原始问题:

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 */