Pammer 发表于 2020-4-19 22:45

函数指针参地址为什么会变?

本帖最后由 Pammer 于 2020-4-20 12:43 编辑

如下代码,为什么两次cout输出的不一样?{:301_1008:}
#include<iostream>
using namespace std;

void a(const char*);

int main()
{
      char* b = new char;
      cout << &b << endl;
      a(b);
      return 0;
}

void a(const char* b)
{
      cout << &b << endl;
      return;
}

寒尘丶Coldust 发表于 2020-4-19 22:58

猜测可能是系统开启了ASLR?

聪明王子 发表于 2020-4-19 23:00

本帖最后由 聪明王子 于 2020-4-19 23:01 编辑

@Pammer   因为main函数中的&b返回的是main中的b指针本身的内存地址,而函数a中的&b返回的是函数a中的b指针本身的内存地址,两者虽然指针指向的内容相同,但是它们本身并不是一个指针,所以会返回两个不一样的内存地址

Pammer 发表于 2020-4-19 23:02

聪明王子 发表于 2020-4-19 23:00
@Pammer   因为main函数中的&b返回的是main中的b指针本身的内存地址,而函数a中的&b返回的是函数a中的b指针 ...

我知道这个,就像副本一样,对吧?
如果我想让参数b和char*变量a地址一样,那该咋办?

bp946 发表于 2020-4-19 23:10

Pammer 发表于 2020-4-19 23:02
我知道这个,就像副本一样,对吧?
如果我想让参数b和char*变量a地址一样,那该咋办?

a(char* &b) 即可

聪明王子 发表于 2020-4-19 23:28

Pammer 发表于 2020-4-19 23:02
我知道这个,就像副本一样,对吧?
如果我想让参数b和char*变量a地址一样,那该咋办?

我觉得这种情况是不可能存在的,因为两个尚未被析构函数当中的局部变量的本身的内存地址是不可能一样的,它们本质上就是两个变量,它们都会分别占一定空间的内存,而这两个变量,它们不可能在栈中占同一空间同一内存。

聪明王子 发表于 2020-4-19 23:38

Pammer 发表于 2020-4-19 23:02
我知道这个,就像副本一样,对吧?
如果我想让参数b和char*变量a地址一样,那该咋办?

这种情况跟副本也不一样,C++中函数的传递类型有两种,分别是按值传递和按地址传递,只有按值传递时才会创建该对象的副本,此时修改该对象不会影响原值,而用引用和指针传递均属于按地址传递,此时修改该对象会影响原值,且不会再次调用构造函数来再次创建该对象,只会再多占用一个指针所占的内存大小(比如int*占4字节),用这种已经完全达到了目的,没有必要使参数b和char*变量a地址一样了。(或者也可以不传参,直接写全局变量,不过不推荐)

Pammer 发表于 2020-4-20 06:30

聪明王子 发表于 2020-4-19 23:38
这种情况跟副本也不一样,C++中函数的传递类型有两种,分别是按值传递和按地址传递,只有按值传递时才会 ...

那么,如果我想在a函数改变b的值,就得加引用?
像这样,对吧。
#include<iostream>
using namespace std;

void a(char*&);

int main()
{
        char* b = new char;
        b = (char*)"1";
        a(b);
        cout << b << endl;
        return 0;
}

void a(char*& b)
{
        b = (char*)"2";
        return;
}

tony666 发表于 2020-4-20 09:42

也可以用双重指针
#include<iostream>
using namespace std;

void a(char** b)
{
    *b = (char*)"2";
    return;
}
int main()
{
    char* b = new char;
    b = (char*)"1";
    a(&b);
    cout << b << endl;
    return 0;
}

这样会不会稍微优雅一点{:1_904:}
#include<iostream>
using namespace std;

#define        PCHAR char*
void a(PCHAR* b)
{
    *b = (PCHAR)"2";
    return;
}

int main()
{
    PCHAR b = new char;
    b = (PCHAR)"1";
    a(&b);
    cout << b << endl;
    return 0;
}

Pammer 发表于 2020-4-20 10:25

tony666 发表于 2020-4-20 09:42
也可以用双重指针
#include
using namespace std;


问一下,这个地方为什么要用char**?指针这块还不是很懂{:301_979:}
页: [1] 2
查看完整版本: 函数指针参地址为什么会变?