函参中的双重指针

在学习swap函数时,若想改变实参,可以将函参设置为指针类型。

那么函参中的双重指针,也是这种含义。想改变实参(指针类型)的指向或值时,可以用双重指针。

void change(char* p)  
{
    p = "bbb";
}

int main()
{
    char *v = "aaa";
    change(v);
    printf("%s",v);
    return 0;
}

输出的结果仍然是aaa。函数在传值时会先拷贝一份再传过去,想一想swap函数就理解了。即p和v是两个单独的指针,p指向别的内存,和v无关,v依然指向aaa。

 

void change(char** p)
{
    *p = "bbb";
}

int main()
{
    char *v = "aaa";
    change(&v);
   printf("%s",v);    
   return 0;
}

双重指针,既可以改变指向、也可以改变值。即p就是v。上述代码本质是改变了v的指向,由常量区的aaa,指向了常量区的bbb

 

关于常量区

int main()
{
    char *v = "aaa";    //指向常量区(该区只读不可写)
    v[0] = 'b';            //报写入权限冲突
    char w[] = "aaa";    //w是已经开辟的局部变量内存,栈内存
    w[0] = 'b';            //正确
    return 0;
}

参考

内存 - 夕西行 - 博客园 (cnblogs.com)

【编译汇编链接】全局变量 char* g_str 和 char g_str[]_char * 全局变量-CSDN博客

 

posted @ 2024-07-05 11:15  夕西行  阅读(5)  评论(0编辑  收藏  举报