代码与分析

  1. //导入strdup函数,用于字符串的复制
  2. #include <stdio.h>
  3. #include <string.h>
  4. struct Person {
  5. char *name;
  6. int age;
  7. int height;
  8. int weight;
  9. };
  10. void myprint(struct Person *p){
  11. printf("p address: %p \n", p);
  12. printf("&p address: %p \n", &p);
  13. printf("output name:%s \n", p->name);
  14. }
  15. int main(int argc, char* argv[]){
  16. struct Person m1={0};
  17. m1.name = "xiaoli";
  18. m1.age = 20;
  19. m1.height=14;
  20. m1.weight=30;
  21. struct Person *m2 = &m1;
  22. printf(">>>>>\n&m2 address: %p \n", &m2);
  23. printf("m2 address: %p \n", m2);
  24. myprint(m2);
  25. return 0;
  26. }

输出结果:


&m2 address: 0x7ffe8a48b728
m2 address: 0x7ffe8a48b730
p address: 0x7ffe8a48b730
&p address: 0x7ffe8a48b6f8
output name:xiaoli

从上面可以看出,指针传参后,其实是变成两个变量,都指向同一个地址。
一个是m2,一个是p。**

说明问题:

  1. 指针在传递的过程中,是将地址传递过去。
  2. 传递过去后, 是一个新的指针变量,里面保存传递过来的地址。

    如果将那个新变量重新赋与新的地址,对原指针变量无影响。
    这里,如果p在函数内被指向了新的地址,对m2没有任何影响,m2继续指向老的地址。
    (如果要改变这种情况,需要使用二级指针)
    **

    Anki制卡

    .|如何从内存角度理解指针传参?

    .|
    1.将指针作为参数传递时,其实是将指针指向的地址传递了进去,将地址赋给了函数里面的新的指针变量。
    2.如果该新的指针变量被重新指向,对调用者这边的指针变量没有影响
    3.如果想产生影响,请使用二级指针