C指针和地址

C指针和地址,c,pointers,memory-address,C,Pointers,Memory Address,我一直认为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,

我一直认为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 */
}
指向数组a的第一个元素。我曾经

char *ap = &a[4];  
指向数组a的第5个元素

这是一个表达

char *ap = a;
与表达式相同

char *ap = &a[0];
最后一个表达式是否比前一个表达式更冗长


非常感谢…

您只能获取左值的地址,即引用对象的表达式<代码>ap+1是一种地址计算。它有一个值,但它是一个临时对象,因此不是左值,您不能获取它的地址


在回答第二个问题时,在表达式中的大多数上下文中,数组衰减为指向其第一个元素的指针,因此是的,
char*ap=a
char*ap=&a[0]是等效的。

您只能获取左值的地址,即引用对象的表达式<代码>ap+1
是一种地址计算。它有一个值,但它是一个临时对象,因此不是左值,您不能获取它的地址


在回答第二个问题时,在表达式中的大多数上下文中,数组衰减为指向其第一个元素的指针,因此是的,
char*ap=a
char*ap=&a[0]是等效的。

如果您认为其中一条语句是罪魁祸首,我将把这一行分成三行,看看编译器在哪里向您抱怨。我也有同样的怀疑,但为了证实这一点,我会按照我刚才告诉你的那样去做。

如果你认为其中一条语句是罪魁祸首,我会把那一行分成三行,看看编译器会向你抱怨什么。我也有同样的怀疑,但为了证实这一点,我会照我刚才告诉你的那样做。

我相信查尔斯对你的主要问题是正确的,你对第二个问题也是正确的:
char*ap=a
相当于
char*ap=&a[0]
我相信查尔斯对你的主要问题是正确的,而你对第二个问题也是正确的:
char*ap=a
相当于
char*ap=&a[0]

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

是的,这里a与&a[0]相同。请注意*(a+b)100%等同于a[b](有关此等效性的不寻常示例,请参见的顶部答案)。获取指向数组成员的指针时,可以使用&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不能。

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

是的,这里a与&a[0]相同。请注意*(a+b)100%等同于a[b](有关此等效性的不寻常示例,请参见的顶部答案)。获取指向数组成员的指针时,可以使用&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不能使用。

是的,我确定它是*&(ap+1)。是的,我确定它是*&(ap+1)。谢谢。我听说过左值和右值。我需要研究一下。谢谢。我听说过左值和右值。我需要研究它们。回答第二个问题:数组名的值是指向该数组第0个元素的指针,因此a将等价于&a[0];谢谢是的,我们总是指向零元素。但在C中,索引也可以是负数,C不会抱怨。回答你的第二个问题:数组名的值是指向该数组第零个元素的指针,因此a相当于&a[0];谢谢是的,我们总是指向零元素。但在C中,指数也可以是负的,C不会抱怨。非常感谢。我们可以说&array[i]=array+i=&array[0]+i吗?是的,因为&array[0]与array相同(只要array是指针或数组)。有趣的构造/关系。谢谢。如果有人不知道,左值意味着一个可以赋值的值,所以可以在=运算符的左侧。我们可以说&array[i]=array+i=&array[0]+i吗?是的,因为&array[0]与array相同(只要array是指针或数组)。有趣的构造/关系。谢谢。如果有人不知道,左值表示可以赋值的值,所以可以在=运算符的左侧