我很困惑,当我将不同的指针传递给不同的函数时,但函数中参数值的地址是相同的。
#include <stdio.h>
//char arr[]={'c', 'a', 't'};
void print(char ca[])
{
printf("&ca=%p, &ca[0]=%p, &ca[1]=%p, ", &ca, &ca[0], &ca[1]);
printf("++ca=%p\n",++ca);
printf("*ca=%c\n",*ca);
}
void print2(const char *pa)
{
printf("&pa=%p, &(pa[0])=%p, &(pa[1])=%p, ", &pa, &(pa[0]), &(pa[1]));
printf("++pa=%p\n",++pa);
printf("*pa=%c\n",*pa);
}
int main(void)
{
char arr[]={'c', 'a', 't'};
char *ptr="cat";
printf("&arr=%p, &(arr[0])=%p, &(arr[1])=%p\n", &arr, &(arr[0]), &(arr[1]));
print(arr);
print2(ptr);
}
当我编译文件时,我看到......
&arr=0x7fff1ae0d755, &(arr[0])=0x7fff1ae0d755, &(arr[1])=0x7fff1ae0d756
&ca=0x7fff1ae0d728, &ca[0]=0x7fff1ae0d755, &ca[1]=0x7fff1ae0d756, ++ca=0x7fff1ae0d756
*ca=a
&pa=0x7fff1ae0d728, &(pa[0])=0x5579970a706c, &(pa[1])=0x5579970a706d, ++pa=0x5579970a706d
*pa=a
为什么 &ca 和 &pa 相同?他们显然不在同一个功能里面。
Peter 的评论解释了为什么地址可以相同。 对于不同的编译器,行为可能有所不同。 例如,gcc 和 icc 给出不同的结果:
./a1.gcc
&arr=0x7fffffffe1b5, &(arr[0])=0x7fffffffe1b5, &(arr[1])=0x7fffffffe1b6
&ca=0x7fffffffe198, &ca[0]=0x7fffffffe1b5, &ca[1]=0x7fffffffe1b6, ++ca=0x7fffffffe1b6
*ca=a
&pa=0x7fffffffe198, &(pa[0])=0x55555555606c, &(pa[1])=0x55555555606d, ++pa=0x55555555606d
*pa=a
❯ ./a1.icc
&arr=0x7fffffffe110, &(arr[0])=0x7fffffffe110, &(arr[1])=0x7fffffffe111
&ca=0x7fffffffe100, &ca[0]=0x7fffffffe110, &ca[1]=0x7fffffffe111, ++ca=0x7fffffffe111
*ca=a
&pa=0x7fffffffe108, &(pa[0])=0x4040a0, &(pa[1])=0x4040a1, ++pa=0x4040a1
*pa=a
❯