1

我遇到了一个指针取消引用问题。

在 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 具有相同的值吗?根据我的理解,它们应该是不同的。提前致谢

4

6 回答 6

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
于 2013-10-22T21:15:49.033 回答
2

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

在声明中

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

两者a&a属于不同的类型。achar *类型(衰减后),&a而是char (*)[5]类型。
a衰减到指向第一个元素的指针,因此a是字符串的第一个元素的地址。While&a是字符串的地址,"abcd"它等于第一个元素的地址。

于 2013-10-22T20:44:45.977 回答
0

数组不是指针。没错,当您说 &p 是指针的地址时,如果 p 定义如下:

char *p;

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

使用数组:

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

于 2013-10-22T20:45:21.893 回答
0

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

char a [] = "abcd";

char *a  = strdup("abcd");

或对于只读字符串

const char *a  = "abcd";

然后,您将获得 a 和 &a 的不同地址。

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

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

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

于 2013-10-22T21:09:54.610 回答
0

char a[] = "abcd"不声明指向但数组的a指针"abcd"。即使一个数组可以衰减为一个指针,它也是一种不同的类型,&a并且a产生相同的地址。

基本上a产生数组第一个元素的地址,所以它等价于&a(and to &a[0])。

于 2013-10-22T20:45:45.710 回答
0

数组将始终引用它存储在内存中的位置,这就是为什么当您打印 a 时,它会为您提供它所在的地址,这等于获取指向数组的指针 (&a)

于 2013-10-22T20:46:06.253 回答