为什么在函数调用输出时printf里面a*和a都可以得到正确答案,这里输出a不是地址吗

void cmp(int* a,int* b,int* c){
    if(*a>*b){
        if(*b>*c)
            printf("%d %d %d\n",*a,*b,*c);//疑问的地方在这个语句中
        else{
            if(*a>*c){
               printf("%d %d %d\n",*a,*c,*b);
            }
            else{
                printf("%d %d %d\n",*c,*a,*b);
            }
        }
    }
    else{
        if(*a>*c)
            printf("%d %d %d\n",*b,*a,*c);
        else{
            if(*b>*c){
                printf("%d %d %d\n",*b,*c,*a);
            }
            else{
                printf("%d %d %d\n",*c,*b,*a);
            }
        }
    }
}
int main(){
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    int* p1=&a;
    int* p2=&b;
    int* p3=&c;
    cmp(p1,p2,p3);
    return 0;
}

 

c/c++中,*a是a的值所指向的地址中存储的值。

比如a = 200;

那么*a是200这个地址中所存储的值。

扩展一点,&a则是指a所在的地址的值,大概如下:

内存

地址     值

150       200    #a变量 所在的位置

200      300

那么对于上述内存地址及地址中存储的值来说,

a变量的值是200

&a是150 ,即a所在的地址的值

*a是300,即a变量值所指向的地址中存储的值

 

谢谢啊,a*是地址的值,确实是正确的,但是如果在cmp函数中换成a不就是地址了吗,为什么结果还是一样的,不是应该不对吗

这个应该是编译器的问题 编译器自动帮你优化了  我用的vs2013调试结果就不一样 

是编译器的原因。从理论上来说,a与*a使用printf函数时输出的结果不同。因为在你调用的函数中,a是地址,*a是a这个指针所指向的值。printf函数输出时,a输出的是指针的地址,*a输出的是指针所指地址中元素的值。