指向字符串的指针

时间:2013-12-11 00:37:41

标签: c

考虑以下计划:

#include <stdio.h>
void foo(char** string)
{
    printf("%s", string[0]);
}

int main()
{
    char* a = "blahblah";
    foo(&a);
    return 0;
}

它可以正常工作,但如果我替换

char* a = "blahblah";

char a[] = "blahblah";

它不起作用。

我收到警告expected 'char **' but argument is of type 'char (*)[9]'和分段错误。 我的印象是char[]char*是相同的,所以指向它们的指针也是一样的。

(带有mingw的窗口,gcc 4.8.1)

谢谢

2 个答案:

答案 0 :(得分:3)

在大多数情况下,这两个语句的行为相同,但有两个例外。一个例外是在应用&amp;运营商。当你申请&amp;对于一个数组(例如a []),你得到了整个数组的地址。该值与数组的第一个元素的地址相同,因此&amp; a == a(它们的类型不同很难)。您可以在此处尝试一个简单示例:http://ideone.com/96w3oa

确定。现在我们可以看到为什么你有一个分段错误。因为&amp; a等于a,你的字符串[0]实际上做了额外的尊重。正确的方法是:

printf("%s", string);

printf("%s", (&string)[0]);

如果您使用

char a[] = "blahblah";

有关您尝试的两个陈述之间差异的更多信息,请参阅此帖(特别是John Bode的帖子):What is the difference between char s[] and char *s?

这也是一个非常好的解释: http://publications.gbdirect.co.uk/c_book/chapter5/arrays_and_address_of.html

答案 1 :(得分:0)

当你将数组传递给foo函数时,你应该这样做。

#include<stdio.h>
void display(char *);

int main()
{
char arr[]="Do something";
display(arr);
return 0;
}
void display(char *string)
{
printf("%s",string);
}

否则您可能会遇到分段错误。使用&amp; array_name时,您实际上会传递起始元素的地址。