在C中引用char数组指针

时间:2013-10-22 20:40:55

标签: c pointers

我遇到了指针解除引用问题。

在C中,& a表示a的地址。如果a是指针,则& a仅表示该指针的地址。

所以如果我们有:

char ptr [] = "abcd"

ptr应该是指向第一个字符的指针,即'a'。因此,

&ptr

应该是ptr的地址,它与'a'的地址不同。但是,当我尝试以下代码时,我真的很困惑:

int main()
{
    char a [] = "abcd";

    printf("0x%X 0x%X", a, &a);

}

Output: 0xBF7E62AB 0xBF7E62AB

有人可以解释为什么a和& a具有相同的价值?根据我的理解,他们应该是不同的。提前谢谢

6 个答案:

答案 0 :(得分:3)

  

所以如果我们有:char ptr [] = "abcd",ptr应该是一个指向第一个字符的指针。

否。完全没有。

ptr数组。数组不是指针。

的确,如果你将ptr声明为真正的指针,那么你会得到预期的行为:

const char *ptr = "abcd";
printf("ptr = %p, &ptr = %p\n", (void *)ptr, (void *)&ptr);

至于为什么数组的地址与第一个元素的地址相同:这是非常合乎逻辑的。该数组表示连续的元素序列。数组的地址是数组从内存开始的位置。它从第一个元素开始的地方开始。因此,第一个元素的地址(相当“可以” - 标准不强制要求这种行为)与数组本身的地址相同。

+-----------+-----------+- - - -
| element 1 | element 2 |
+-----------+-----------+- - - -
^ start of array
^ start of first element

答案 1 :(得分:2)

  

有人可以解释为什么a和& a具有相同的价值?根据我的理解,他们应该是不同的。

声明

  printf("0x%X 0x%X", a, &a);  

a&a都属于不同类型。 a类型为char *类型(在衰退后),而&a属于char (*)[5]类型。 a衰减到指向第一个元素的指针,因此a是字符串的第一个元素的地址。虽然&a是字符串"abcd"的地址,但它等于第一个元素的地址。

答案 2 :(得分:0)

数组不是指针。当你说& p是指针的地址时,这是正确的,如果p被定义如下:

char *p;

数组不同,并且没有完全相同的行为。

使用数组:

char a[] = "abc";&a[0]是数组中第一个元素的地址,与a相同。

答案 3 :(得分:0)

char a[] = "abcd"不会将a指针指向"abcd",而是指向数组。即使数组可以衰减为指针,它也是&aa产生相同地址的不同类型。

基本上a会产生数组第一个元素的地址,因此它等同于&a(和&a[0])。

答案 4 :(得分:0)

数组总是会引用它存储在内存中的位置,这就是为什么当你打印一个时,它会给你一个地址,它等于让指针指向数组(& a)

答案 5 :(得分:0)

为了获得你寻求改变的行为

char a [] = "abcd";

char *a  = strdup("abcd");

或者只读字符串

const char *a  = "abcd";

然后,您将获得a和& a。

的不同地址

将数组传递给函数时,数组将转换为指针。 使用原始程序尝试

printf("%d %d\n",sizeof(a),sizof(&a));

第一个将随着字符串的大小而变化,第二个将基于您机器上的指针大小。