指针 - 数组和指针的区别

3
什么是a&a和第一个元素a [0]的地址之间的区别?同样,p是分配给数组地址的整数指针。 pointer []是否执行指针算术并根据数据类型获取值?进一步说,*期望什么值?应该是一个指针吗?
#include<stdio.h> 
int main()
{
int a[] = {5,6,7,8};
int *p = a;
printf("\nThis is the address of a %u, value of &a %u, address of first element %u, value pointed by a %u", a, &a, &a[0], *a);
printf("\nThis is the address at p %u, value at p %u and the value pointed by p %d", &p, p, *p);
printf("\n");
}

This is the address of a 3219815716, value of &a 3219815716, address of first element 3219815716, value pointed by a 5
This is the address at p 3219815712, value at p 3219815716 and the value pointed by p 5

请阅读此处的C-Faq,特别是第6节和Q.6.12、6.13链接 - cyber_raj
1
请阅读此问题的答案:http://stackoverflow.com/questions/26149426/how-can-an-address-have-multiple-values - Hari
2个回答

3
int a[]={5,6,7,8};
int *p= a;

请注意,在数组的情况下(大多数情况),例如数组 a,a 的 ADDRESS_OF 与数组的第一个元素的 ADDRESS_OF 相同。即 ADDRESS_OF(a) 等同于 ADDRESS_OF(a[0])。&是 ADDRESS_OF 运算符,因此在数组 a 的情况下,&a 和 &a[0] 都相同。
我已经强调过,在大多数情况下,数组的名称将转换为其第一个元素的地址;一个显著的例外是当它是 sizeof 的操作数时,这对于与 malloc 有关的内容非常重要。另一种情况是当数组名是 & 地址运算符的操作数时。在这种情况下,它被转换成整个数组的地址。有何不同?即使您认为地址在某种程度上“相同”,关键区别在于它们具有不同的类型。对于 n 个类型为 T 的元素的数组,则第一个元素的地址具有类型“指向 T 的指针”;整个数组的地址具有类型“指向 n 个类型为 T 的元素的数组的指针”,显然非常不同。
以下是一个示例:
int ar[10];
int *ip;
int (*ar10i)[10];       /* pointer to array of 10 ints */

ip = ar;                /* address of first element */


ip = &ar[0];            /* address of first element */
ar10i = &ar;            /* address of whole array */

您可以查阅《C语言教程》以获取更多相关信息。


Sanjay,我不理解的一个方面是:“即使您认为地址在某种程度上是‘相同的’,关键区别在于它们具有不同的类型”。因此,&ar将编译为完整数组的地址-最终只是4/8字节的整数,因为内存存储在4/8字节中。数组大小的额外信息存储在什么地方?通过“类型”,您是否意味着编译器解释变量的方式会有所不同?特别是算术运算? - Nishant

2
在C语言中,指针和数组非常相似。在您的示例中,ap之间唯一的区别是sizeof a4 * (sizeof int),而sizeof p是指针的大小,可能为4或8,具体取决于您的平台。除此之外,C并没有真正区分指针和数组。因此,a[0]、*a、p[0]和*p都是相同的。在某些情况下,甚至0[p]也是有效的,这只是指针算术运算。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接