输出:
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â€æ˜¯æŒ‡å‘数组的指针的地å€ä½ç½®ï¼Ÿ
请帮助澄清。
ç”案 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