繁体   English   中英

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

[英]Question about a pointer in a program. [C]

这是它的完整代码

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

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

为什么会这样?

这部分是什么意思?

(unsigned short*)argv[1]

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

  • argv[0][0] (一个char
  • argv[0] (一个char* )
  • argv (一个char**

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

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

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

看一看关于类型转换的入门。

解决原始问题:

argv是一个指针数组,每个指针指向一个字符数组。 argv[1]是指向具有第一个参数的字符数组的指针(即,如果您运行./program arg1 arg2 ,则指针argv[1]指向字符串arg1 )。

& 符号用于表示引用,在大多数情况下与指针相同。 它是一种语法糖,可以很容易地传递对您已经声明的变量的引用。 常见的例子是使用 scanf。

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

相当于

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

该程序本身旨在翻转字节顺序。 逐个字符地 go 是不够的,因为您必须一次翻转两个字节(即逐个短),这就是它使用短裤工作的原因。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM