2011-07-19 33 views
2

這裏是它的完整代碼關於程序中指針的問題。 [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]; 

ARENT指針應該指向「地址」的變量?上面的不是(使用&符號)。然而該程序按預期工作。

這是爲什麼?

這部分是什麼意思?

(unsigned short*)argv[1] 

回答

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

查看type casting的引物。

+0

argc和argv定義參數的數量和程序命令中參數的值。這裏argv的第二個元素(一個char指針)被轉換爲一個無符號的短指針。 –

6

argv是一個指針到一個陣列-的指針:

  • argv[0][0](一個char
  • argv[0](一個char*
  • argv(一個char**

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

...的作品,因爲你引用了該集合中的第二個「字符串」。

注意,在這種情況下,「char」和「unsigned short可能大致equivolent取決於編譯器和平臺,但它可能是,不要認爲一個好主意。例如,如果編譯爲啓用「unicode」命令行,則可能會從命令行轉發給您,而不是從「char」轉發給您的「short」。但是,這可能是一個危險的假設,因爲「這幾天」一個「short」通常是16位,而「char」通常是8位。

+0

不是短的,通常是字符大小的兩倍?這對他們採用'strlen/2'也是有意義的。 –

+0

@sharth,好點,我更新以澄清它可能/可能不是一個好主意...... – charley

+0

'char'和'unsigned short'不是「大致相等」。在大多數平臺上,char是單個字節,而short是2個字節。由於奇怪的轉換爲'unsigned short *',並且他的反轉函數想要一個'unsigned short *'而不是'char *',所以OP的程序在反轉輸入字符串方面做得並不好。 http://www.ideone.com/2aZPr – Praetorian