琴长不过时光 发表于 2020-4-8 13:37:45

大佬请过目 关于指针的引用的疑问

#include "iostream"
using std::endl;
using std::cout;
using std::cin;

typedef struct Teacher
{
        int age;
        char name;
}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的别名,内部结构是啥样的?另一个指针,也指向这个空间吗?
{
        pT2->age = 44;
        strcpy(pT2->name, "风云");
}

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

        fun2(p1);
        cout << p1->age << " " << p1->name << endl;
        system("pause");
}

琴长不过时光 发表于 2020-4-8 13:47:12

#define _CRT_SECURE_NO_WARNINGS
#include "iostream"
using std::endl;
using std::cout;
using std::cin;

typedef struct Teacher
{
        int age;
        char name;
}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, "风云");
}

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

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

        system("pause");
}

梦想灬远帆 发表于 2020-4-8 15:07:37

TEAC * p1 = NULL;   //这里,p1指向的地址是0x00000000,并不是说 p1 的地址是NULL,它指向NULL,但你还是可以获取它的地址, &p1拿的是 p1的地址,所以func1的形参是二级指针,*(*p1) 的结果是 NULL

*&功能是相反的,&取地址,*解引用,取完地址再解引用,相当于没做任何变化,所以func2的形参相当于(TEAC pT2)

4goodworld 发表于 2020-4-8 16:39:35

总结一下指针和引用的相同点和不同点:

★相同点:

●都是地址的概念;

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

★不同点:

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

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

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

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

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

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

●引用是类型安全的,而指针不是
我网上搜的,希望对你有用{:10_256:}

howzyao 发表于 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()这样子.
以上对否全靠回忆,还没实验,请大家鉴定.

howzyao 发表于 2020-4-8 18:46:38

以下是实验结果,应当可以说明你的问题:

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

typedef struct student
{
      char name;
      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;
}




      

howzyao 发表于 2020-4-8 18:52:35

本帖最后由 howzyao 于 2020-4-8 18:54 编辑

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

楼主可以试试,可以思考它们的地址是什么?
变量就要有地址.
新指针无论指不指谁,它都有地址,因为它也是变量,指针变量.
组数的本质,就是一组连续的内存,它也是变量,同时也是指针,所以,指针赋给指针,是可行的.当指针(数组中的元素)赋给这个同类型指针时,地址就发生了变化.

howzyao 发表于 2020-4-8 18:56:20

可以的话,就赏一个分吧?{:10_282:}

琴长不过时光 发表于 2020-4-9 11:58:37

howzyao 发表于 2020-4-8 18:56
可以的话,就赏一个分吧?

给你分吧
页: [1]
查看完整版本: 大佬请过目 关于指针的引用的疑问