2015-01-21 32 views
2

我對C中的指針有點困惑。我的理解是,要從指針中獲取值,我們需要在前面添加星號(取消引用)。那麼爲什麼在下面的代碼中我定義了兩個指針,然後分配給他們什麼argvs指向工作就好了? 但是,如果我在printf中放置星號,它不起作用? 也就是說如果我的參數是file_onefile_two輸出將是file_one file_two獲取值時不需要提取C中的指針C

由於

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char** argv) 
{ 

    char *File_1, *File_2; 

    File_1 = argv[1]; 
    File_2 = argv[2]; 
    printf("%s %s\n", File_1, File_2); 

    return EXIT_SUCCESS; 
} 

回答

5

在「參數向量」 argv是一個指向指針的指針(類型char**)。代碼中的任務分配argv[1](其類型爲char*)至File_1(也是類型char*)。總共有一個char*被複制到另一個char*。這些指針不會被進一步解除引用,否則只會複製一個char,這是不需要的。在C中,字符串通常實現爲char*,而只複製一個char會與此語義相沖突。

+0

謝謝科多爾。說得通。但仍然令人困惑,因爲我是新的C – 2015-01-21 10:49:42

+0

@Max_S我* *不是新的C;但不時仍然嚴重混淆。 – Codor 2015-01-21 10:51:34

-1

File_1是指向char變量的指針。

而當您使用*File_1取消引用時,請參閱char而不是char *

由於printf使用%s字符串即char *因此,打印*File_1你應該使用%c

3
char *p = argv[1]; 

agrv是雙指針,以便它可以容納指針argv[0]argv[1]等。

現在argv[1]是一個指針。所以該指針的地址已經被分配給同一類型的另一指針pchar

實施例:

char **p = malloc(sizeof(char*) * 2);/* double pointer */ 

p[0] = malloc(20); /* memory allocated to single pointer */ 
p[1] = malloc(20); /* memory allocated to single pointer */ 

strcpy(p[0],"string"); 
strcpy(p[1],"another"); 

printf("%s\n",p[0]); 
printf("%s\n",p[1]); 

在二維空間

int **p; /* Here p is double pointer */ 

*p is a single pointer. 

如已經在另一個答案%s指出期望char *並且您只需傳遞char類型的指針並允許printf()執行取消引用

PS:* P = P [0]

3

printf(3),這裏是爲s轉換指定的文件(即%s):

如果沒有升改性劑的存在:本常量字符*參數預計爲 是指向字符類型數組(指向字符串的指針)的指針。 數組中的字符被寫入(但不包括)終止空字節('\ 0')的 ;如果指定精度,則不會寫入比指定的數字更多的 。如果給出了精度,則不需要存在空字節 ;如果未指定精度或者數組大小大於 ,則該數組必須包含終止空字節的 。

所以基本上printf是在它自己內部提領它。如果你做了雙間接那麼它可能會導致UB,因爲:

printf("%s %s\n", *File_1, *File_2); 

上述發送由File_1File_2指出第一個字符,然後printf將再次嘗試取消引用它裏面想着你送一個指針時爲char你實際上發送了一個字符。

0

試着想象這在內存中看起來像什麼: char** argv是一個指向指針的指針,兩個指針碰巧指向一個數組的開始。第一個數組看起來像[0][1]其中每個項目是一個指向char *

[0] -> ["file_one"] 
[1] -> ["file_two"] 

哪裏["file_one"]實際上只是一個指針到內存'f',所以我們在內存和空字節有'f', 'i', 'l', 'e', '_', 'o', 'n', 'e', '\0'彼此相鄰'\0'告訴我們數組在哪裏結束。

所以,當你分配:

char * File_1 = argv[1]; 

File_1現在包含一個指向第一f,當我們使用printf

printf("%s %s\n", File_1, File_2); 

它接受char *,假定這是一個空終止字符串,並將指針解除引用連續的內存位置,直到達到空字節以讀入字符串的內容爲止。