数组å如何包å«å…¶åœ°å€ä»¥åŠå…¶ä¸­çš„第一个元素?

时间:2013-10-13 10:31:41

标签: c pointers

输出:

a=1606416992, &a=1606416992,
*a=1, &(*a)=1606416992

程åºï¼š

#include "stdio.h"
main()
{
    int a[4]={1,2,3,4};
    printf("a=%u, &a=%u, *a=%d, &(*a)=%u\n",a,&a,*a,&(*a));
}

我知é“数组å是指å‘数组第一个元素的指针。 但我怀疑是指针应该存储在æŸä¸ªåœ°æ–¹ï¼Œå®ƒåº”该有一个地å€ä½ç½®ã€‚ 如果是这样,如何存储ä½ç½®â€œ1606416992â€å…ƒç´ â€œ1â€å¹¶ä¸”相åŒçš„“1606416992â€æ˜¯æŒ‡å‘数组的指针的地å€ä½ç½®ï¼Ÿ

请帮助澄清。

3 个答案:

答案 0 :(得分:5)

在表达å¼ä¸­ä½¿ç”¨æ—¶ï¼Œæ•°ç»„å称会衰å‡ä¸ºæŒ‡å‘第一个元素的指针。但是,此规则有3个例外:

  • 数组显示为sizeof();
  • çš„æ“作数
  • 数组的地å€æ˜¯ä½¿ç”¨&è¿ç®—符;
  • 数组是字符串或宽字符串文字åˆå§‹å€¼è®¾å®šé¡¹ã€‚

在您的代ç ä¸­ï¼Œaå’Œ&(*a}都是相åŒçš„,因为*aç­‰åŒäºŽa[0],因此&(*a)是相åŒçš„地å€ä¸ºa。

&a与a具有相åŒçš„地å€ï¼Œå› ä¸ºä½¿ç”¨&时,数组ä¸ä¼šè¡°å‡ä¸ºæŒ‡é’ˆã€‚因此,&a表示数组的地å€ï¼Œå³å¯ä»¥æ‰¾åˆ°ç¬¬ä¸€ä¸ªå…ƒç´ çš„地å€ã€‚对于&a,你没有将指针的地å€å¸¦åˆ°ç¬¬ä¸€ä¸ªå…ƒç´ ï¼Œä½ æ­£åœ¨èŽ·å–数组的地å€ï¼Œå› ä¸ºåœ¨è¿™ç§ç‰¹æ®Šæƒ…况下aä¸æ˜¯æŒ‡å‘第一个元素的指针。

修改 如其他答案中所述,在转æ¢ä¸º%p之åŽï¼Œæ‚¨åº”该使用void *æ¥æ‰“å°æŒ‡é’ˆå€¼ï¼š

printf("a=%p, &a=%p, *a=%d, &(*a)=%p\n",(void *) a, (void *) &a,*a,(void *) &(*a));

答案 1 :(得分:1)

数组å称是数组而ä¸æ˜¯æŒ‡é’ˆï¼Œä½†åœ¨ä½œä¸ºå‚数传递给函数时衰å‡åˆ°æŒ‡é’ˆï¼ˆä¸åŒ…括æŸäº›å¼‚常)。

当a传递给printf时,它会衰å‡æŒ‡å‘其第一个元素的指针。 &a是整个数组a的地å€ã€‚由于æ¯ä¸ªå˜é‡å ç”¨ä¸€ä¸ªæˆ–多个字节的内存:第一个字节的地å€è¢«ç§°ä¸ºå˜é‡çš„地å€ï¼Œæ•°ç»„的地å€æ˜¯å †æ ˆå†…存的起始地å€ï¼Œä¹Ÿæ˜¯åœ°å€çš„地å€ã€‚ a的第一个元素。

传递&(*a)类似于传递a(解除引用a并å†æ¬¡å¼•ç”¨å®ƒï¼‰ã€‚
此外,还应注æ„%u预计unsigned int。è¦æ‰“å°æŒ‡é’ˆçš„值,请使用%p并进行转æ¢ã€‚

printf("a=%u, &a=%u, *a=%d, &(*a)=%u\n", (void *)*a, (void *)&a,*a, (void *)&(*a));

答案 2 :(得分:1)

aå’Œ&a的输出值相åŒã€‚但是,它们的类型ä¸åŒã€‚

对a的引用的类型为“pointer to typeâ€ï¼Œä½†&a的引用为“pointer-to-array-of-n-typeâ€ï¼Œå…¶ä¸­n是数组的大å°ã€‚< / p>

让我们å°è¯•åœ¨ä¸‹é¢çš„代ç ä¸­ç†è§£ç›¸åŒçš„内容:

#include <stdio.h>

int main()
{

   int a[4]={1,2,3,4};

   int *ptr1=a;

   int (*ptr2)[4]=&a;

   printf("a points to first element of array :%p\n",(void*)a);
   printf("&a points to whole array. Start address is same as 'a': %p\n",(void*)&a);
   printf("Incrementing 'a' steps to the next element in array New Value: %p\n",(void*)(a+1));
   printf("Incrementing '&a' steps over the entire array. New Value: %p\n",(void*)(&a+1));

   printf("ptr1: %p, ptr2:%p\n",(void*)ptr1,(void*)ptr2);

   return 0;
}

输出:

a points to first element of array :0x7fff3da3d560
&a points to whole array. Start address is same as 'a': 0x7fff3da3d560
Incrementing 'a' steps to the next element in array New Value: 0x7fff3da3d564
Incrementing '&a' steps over the entire array. New Value: 0x7fff3da3d570
ptr1: 0x7fff3da3d560, ptr2:0x7fff3da3d560

ptr1是类型:指å‘整数的指针。在这个程åºä¸­ï¼Œå®šä¹‰ä¸ºæŒ‡å‘数组å称的指针。因此,ä¿æŒæ•°ç»„的第一个元素的地å€ã€‚ ptr1 = &a[0]

ptr2是类型:指å‘4个整数的数组的指针。在这个程åºä¸­ï¼Œå®šä¹‰ä¸ºæŒ‡å‘整个数组的指针。递增ptr2会导致它跨越整个数组。通常仅在使用数组数组è¿è¡Œæ—¶æ‰æœ‰ç”¨ã€‚

å¯è§†åŒ–数组a的存储:

+-----------------+-----------------+-----------------+-----------------+
|        1        |        2        |        3        |        4        |
+-----------------+-----------------+-----------------+-----------------+
0x7fff3da3d560    0x7fff3da3d564    0x7fff3da3d568    0x7fff3da3d56c    0x7fff3da3d570
â–² â–²   â–²      â–²    â–²        â–²                                            â–²  â–²
| |   |      |    |        |                                            |  |
|(a)  |      |    (a + 1)  |                                            |  |
|     (ptr1) |             (ptr1 + 1)                                   |  (ptr2 + 1) 
|------------|----------------------------------------------------------|
|            |                                                          | 
|            (ptr2)                                                     |
|                                                                       |
(&a) = 0x7fff3da3d560                                                   (&a + 1) = 0x7fff3da3d570