在C中传递char指针

时间:2013-12-27 01:05:27

标签: c arrays function pointers

我正在学习C中的指针,所以我这样做是为了查看我在做某事时应该希望的输出。这是:

int characters(char temp[])
{
    printf("\nAddress of string by &temp: %p",&temp);
    printf("\nAddress of string by temp: %p",temp);
    printf("\nContent of string: %s",temp);     
    return 0;
}
int main()
{
    char s[] = "Prafulla Shahi";
    char *t=s;
    clrscr();
    characters(t);
    printf("\nMain\nAddress of string by &s: %p",&s);
    printf("\nAddress of string by s: %p",s);
    printf("\nContent of string: %s",s);
    printf("\nAddress of pointer by &t: %p",&t);
    printf("\nAddress of pointer by t: %p",t);
    printf("\nContent of pointer: %s",t);
    getch();
    return(0);
}

我得到的输出是:

Address of string by &temp: 0x7fff4ab45788
Address of string by temp: 0x7fff4ab457b0
Content of string: Prafulla Shahi    
Main
Address of string by &s: 0x7fff4ab457b0
Address of string by s: 0x7fff4ab457b0
Content of string: Prafulla Shahi
Address of pointer by &t: 0x7fff4ab457a8
Address of pointer by t: 0x7fff4ab457b0
Content of pointer: Prafulla Shahi

我的问题是: 当由& temp和temp?

询问时,temp数组的地址显示两个不同的值

我的理解是,temp是一个数组变量,但它有自己的地址(与指针t类似的行为。为什么它的行为不像通常的变量数组?)。 main()中的数组s []也是一个数组,但是当& s和s调用时,它的地址显示相同的值。

有人可以解释一下吗?

5 个答案:

答案 0 :(得分:2)

char s[] = "Hello world";

s是一个数组对象(用字符串文字初始化)。数组的地址和数组的第一个元素的地址是相同的(只有类型不同)。

所以:

(char *) &s == s  /* value of the == expression is 1 */

可是:

char *p = "Hello world";

p是指针对象(指向字符串文字)。 p的地址是指针对象的地址,该地址不同于p的值,"Hello world"是指向(char *) &p == p /* value of the == expression is 0 */ 字符串的第一个字符的指针。

所以:

 int characters(char temp[]) { /* ... */ }

要完成回到您的示例,我还必须添加一个函数声明中的数组参数在C中调整到指针类型的参数。所以这两个函数声明是等价的:

 int characters(char *temp) { /* ... */ }

characters

这也意味着在(char *) &temp == temp /* value of the == expression is 0 */ 函数内部,我们有:

temp

因为{{1}}是指针对象而不是数组对象。

答案 1 :(得分:2)

  

我的理解是,temp是一个数组变量

不幸的是,不,不是。

当您将数组传递给函数时,它会衰减为指向其第一个元素的指针。作为一个非常合乎逻辑的结果,决定当你像数组一样声明一个函数参数时,它将被解释为一个指针。所以在函数参数声明中,仅在函数参数声明中,数组表示法与指针限定符等效。所以

int characters(char temp[])

相同
int characters(char *temp)

指针是一个保存值(地址)并且也有自己的地址的对象,因此当然temp&temp不同。

您是否已将函数参数外的temp声明为真实数组(而不是指针),您的期望是否已得到满足;然后当然&temp指向与指针temp本身腐朽的地址相同的地址。

答案 2 :(得分:1)

当传递给函数时,数组被分解为指针(指向其第一个元素)。您可以使用数组表示法来简化您的生活,但就编译器而言,temp是char *,而不是实际的数组。这就是为什么它的行为与t相同,而不是s。

答案 3 :(得分:1)

s是静态分配的数组。因此,它的值和第一个元素的地址是相同的。

ttemp都是指向s的新指针变量。它们的值是s的地址。但是这些变量中的每一个都是单独分配的,因此每个变量都有自己的地址。

s (address = 0x7fff4ab457b0)
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| P | r | a | f | u | l | l | a |   | S | h | a | h | i |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  ^
  |  temp (address = 0x7fff4ab45788)
  |  +----------------+
  +--| 0x7fff4ab457b0 |
  |  +----------------+
  |
  |  t (address = 0x7fff4ab457a8)
  |  +----------------+
  +--| 0x7fff4ab457b0 |
     +----------------+

答案 4 :(得分:1)

character(char temp[])定义函数中,temp是指向char的指针。将数组名称作为参数传递时,其第一个元素的地址将复制到temp。检查一下:http://www.tutorialspoint.com/cprogramming/c_passing_arrays_to_functions.htm

因此,当您尝试打印temp的值时,它会打印数组中第一个元素的地址。但是,当您尝试打印&temp的值时,您不打印数组的地址,而是打印指针本身的地址。

要以其他方式打印地址,您可以使用:

printf("\nAddress of string by &temp: %u",&temp[0]);