为什么参数地址相同?当里面有不同的功能时

问题描述 投票:0回答:1

我很困惑,当我将不同的指针传递给不同的函数时,但函数中参数值的地址是相同的。

#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 相同?他们显然不在同一个功能里面。

c pointers
1个回答
0
投票

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
❯
© www.soinside.com 2019 - 2024. All rights reserved.