2015-01-21 68 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 *,假定这是一个空终止字符串,并将指针解除引用连续的内存位置,直到达到空字节以读入字符串的内容为止。