我遇到了指针解除引用问题。
在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具有相同的价值?根据我的理解,他们应该是不同的。提前谢谢
答案 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"
,而是指向数组。即使数组可以衰减为指针,它也是&a
和a
产生相同地址的不同类型。
基本上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));
第一个将随着字符串的大小而变化,第二个将基于您机器上的指针大小。