鱼C论坛

 找回密码
 立即注册
查看: 837|回复: 8

[已解决]大佬请过目 关于指针的引用的疑问

[复制链接]
发表于 2020-4-8 13:37:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include "iostream"
  2. using std::endl;
  3. using std::cout;
  4. using std::cin;

  5. typedef struct Teacher
  6. {
  7.         int age;
  8.         char name[20];
  9. }TEAC;

  10. void fun1(TEAC** pT1)
  11. {
  12.         TEAC* tmp = new TEAC;
  13.         if (tmp == NULL)
  14.         {
  15.                 return;
  16.         }
  17.         tmp->age = 33;
  18.         strcpy(tmp->name, "许文");
  19.         *pT1 = tmp;
  20. }

  21. void fun2(TEAC*& pT2)  //问题 :指针的引用 还是一个指针吗?从字面上看是pT2的别名,内部结构是啥样的?另一个指针,也指向这个空间吗?
  22. {
  23.         pT2->age = 44;
  24.         strcpy(pT2->name, "风云");
  25. }

  26. void main()
  27. {
  28.         TEAC* p1 = new TEAC;//改变一级指针指向 用二级指针
  29.         fun1(&p1);
  30.         cout << p1->age << " " << p1->name << endl;

  31.         fun2(p1);
  32.         cout << p1->age << " " << p1->name << endl;
  33.         system("pause");
  34. }
复制代码
最佳答案
2020-4-8 18:56:20
可以的话,就赏一个分吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-8 13:47:12 | 显示全部楼层
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "iostream"
  3. using std::endl;
  4. using std::cout;
  5. using std::cin;

  6. typedef struct Teacher
  7. {
  8.         int age;
  9.         char name[20];
  10. }TEAC;

  11. void fun1(TEAC** pT1)
  12. {
  13.         TEAC* tmp = new TEAC;
  14.         if (tmp == NULL)
  15.         {
  16.                 return;
  17.         }
  18.         tmp->age = 33;
  19.         strcpy(tmp->name, "许文");
  20.         *pT1 = tmp;
  21. }

  22. void fun2(TEAC*& pT2)
  23. {
  24.         pT2->age = 44;
  25.         strcpy(pT2->name, "风云");
  26. }

  27. void main()
  28. {
  29.         TEAC* p1 = NULL;
  30.         fun1(&p1);   //问题:  p1为NULL  为何还能取p1的地址 扔给fun1
  31.         cout << p1->age << " " << p1->name << endl;

  32.         fun2(p1);  //问题 引用的实质是指针 p1为NULL 如何能传 p1的地址?
  33.         cout << p1->age << " " << p1->name << endl;

  34.         system("pause");
  35. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 15:07:37 | 显示全部楼层
TEAC * p1 = NULL;   //这里,p1指向的地址是0x00000000,并不是说 p1 的地址是NULL,它指向NULL,但你还是可以获取它的地址, &p1拿的是 p1的地址,所以func1的形参是二级指针,*(*p1) 的结果是 NULL

*&功能是相反的,&取地址,*解引用,取完地址再解引用,相当于没做任何变化,所以func2的形参相当于(TEAC pT2)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 16:39:35 | 显示全部楼层
总结一下指针和引用的相同点和不同点:

★相同点:

●都是地址的概念;

指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。

★不同点:

●指针是一个实体,而引用仅是个别名;

●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;

●引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有     的,  前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)

●引用不能为空,指针可以为空;

●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;

●指针和引用的自增(++)运算意义不一样;

●引用是类型安全的,而指针不是
我网上搜的,希望对你有用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 18:19:30 | 显示全部楼层
void fun2(TEAC*& pT2)  //问题 :指针的引用 还是一个指针吗?从字面上看是pT2的别名,内部结构是啥样的?另一个指针,也指向这个空间吗?

参数列表: TEAC*& pT2 == TEAC pT

为什么呢?个人认为: TEAC & pT2时,指pT2的地址,此时pT2是一个TEAC类型所创建的对像,对像的变量名叫做pT2而已;
*& pT2;相当于把pT2地址解除引用,就是pT2; 此时,需要调用成员的话,应是pT2.show()这样子.
以上对否全靠回忆,还没实验,请大家鉴定.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 18:46:38 | 显示全部楼层
以下是实验结果,应当可以说明你的问题:

#include <cstdlib>
#include <iostream>
#include <stdio.h>
using namespace std;

typedef struct student
{
        char name[5];
        int age;

}teac;
   
void fun1(teac **pT1)
{
        teac* tmp = new teac;
        if (tmp == NULL)
        {
                return;
        }
        tmp->age = 33;
        strcpy(tmp->name, "许文");
        *pT1 = tmp;
}
void fun2(teac *&pT2)
{
        pT2->age = 44;
        strcpy(pT2->name, "风云");
}   
   
                       
int main(int argc, char *argv[])
{
    teac a;
    teac *p1;
    teac *ppa = new teac;
   
    ppa=&a;
    strcpy(a.name, "abc");
    a.age=100;
   
    fun1(&p1); // 这里要加地址,是因为fun参数列表使用了 两个解除引用
   
    cout << p1->age << " " << p1->name << endl;
    cout<<"p1的地址是"<<p1<<" p1中name的值放在地址"<< &(p1->name)<<"中"<<endl;
    cout<<"*p1=="<<p1<<" ---这是指针的址地"<<endl;
    cout<<"&p1=="<<&p1<<" ---这是存放指针的地址"<<endl;
   
    cout<<"-----------------------------------------"<<endl;
   
    cout<< a.age<<" "<<a.name<<endl;
    cout << ppa->age << " " << ppa->name << endl;
    cout<<"-----------------------------------------"<<endl;
    cout<<"a的地址是"<<&a<<" a中name的值放在地址"<< &(a.name)<<"中"<<endl;
    cout<<"*a=="<<ppa<<" ---这是指针的址地"<<endl;
    cout<<"&p1=="<<&ppa<<" ---这是存放指针的地址"<<endl;

   
   
     
    system("PAUSE");
    return EXIT_SUCCESS;
}




        
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 18:52:35 | 显示全部楼层
本帖最后由 howzyao 于 2020-4-8 18:54 编辑

这让我想起了
int aa[3]={1,10,100};
   
    cout<<aa<<endl;
    cout<<*aa<<endl;
    cout<<&aa<<endl;
    int *pint = new int;
    pint = aa;
    cout<<pint<<endl;
    pint = &aa[1];
    cout<<pint<<endl;

楼主可以试试,可以思考它们的地址是什么?
变量就要有地址.
新指针无论指不指谁,它都有地址,因为它也是变量,指针变量.
组数的本质,就是一组连续的内存,它也是变量,同时也是指针,所以,指针赋给指针,是可行的.当指针(数组中的元素)赋给这个同类型指针时,地址就发生了变化.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 18:56:20 | 显示全部楼层    本楼为最佳答案   
可以的话,就赏一个分吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-9 11:58:37 | 显示全部楼层
howzyao 发表于 2020-4-8 18:56
可以的话,就赏一个分吧?

给你分吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 10:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表