繁体   English   中英

C指针和地址

[英]C pointers and addresses

我一直以为C中的*&p = p =&* p。我尝试了以下代码:

 #include <stdio.h>
 #include <stdlib.h>

 char a[] = "programming";
 char *ap = &a[4];  

int main(void)
{

 printf("%x %x %x\n", ap, &*(ap), *&(ap));   /* line 13 */
 printf("%x %x %x\n\n", ap+1, &*(ap+1), *&(ap+1));   /* line 14 */
}

第一行printf行(第13行)为我提供了地址:

40b0a8 40b0a8 40b0a8

与预期相同。 但是,当我添加第二条printf行时,Borland抱怨:

“ first.c”:E2027必须在第14行的函数main中获取一个存储位置的地址

我期待得到:

40b0a9 40b0a9 40b0a9。

第14行上的表达式*&(ap + 1)似乎是罪魁祸首。 我认为第14行上的所有三个指针表达式都是等效的。 我为什么想错了?

第二个相关问题:线

char *ap = a;

指向数组a的第一个元素。 我用了

char *ap = &a[4];  

指向数组a的第五个元素。

是表达

char *ap = a;

与表达式相同

char *ap = &a[0];

最后一个表达式是否仅比前一个更冗长?

非常感谢...

您只能使用左值的地址,即引用对象的表达式。 ap + 1是地址计算。 它有一个值,但它是一个临时对象,因此不是左值 ,您不能使用其地址。

为了回答您的第二个问题,在大多数情况下,在表达式中,数组会衰减为指向其第一个元素的指针,所以,是, char *ap = a; char *ap = &a[0]; 是等效的。

使用C引用运算符时,它必须指向有效的左值,而不是任意表达式。 因此, &(ap+1)无效,因为值ap+1只是一个表达式,而不是位置。 你不能说ap+1 = foo();

是的,a与&a [0]相同。 请注意,*(a + b)等于a [b] 100%(有关此等价的不寻常示例,请参见最奇怪的语言功能的最高答案)。 获取指向数组成员的指针时,可以使用&array [i]或array + i。 例:

struct foo array[5];
struct foo *item_3 = &array[3];
struct foo *also_item_3 = array + 3;

在这种情况下,使用array+i还是&array[i]是一个风格问题。 &array[i]可以说是一个更好的选择,因为很明显要获取数组项。 而且,&vec [i]可与C ++的向量一起使用,而vec + i则不能。

如果您认为这些语句之一是罪魁祸首,那么我将把这一行分成三行,看看编译器在哪里抱怨您。 我也有同样的怀疑,但是要确认,我会按照我刚才告诉你的那样做。

我相信Charles对您的主要问题是正确的,而您对第二个问题是正确的char *ap = a; 等同于char *ap = &a[0];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM