大佬请过目 关于指针的引用的疑问
#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");
} #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");
} TEAC * p1 = NULL; //这里,p1指向的地址是0x00000000,并不是说 p1 的地址是NULL,它指向NULL,但你还是可以获取它的地址, &p1拿的是 p1的地址,所以func1的形参是二级指针,*(*p1) 的结果是 NULL
*&功能是相反的,&取地址,*解引用,取完地址再解引用,相当于没做任何变化,所以func2的形参相当于(TEAC pT2) 总结一下指针和引用的相同点和不同点:
★相同点:
●都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。
★不同点:
●指针是一个实体,而引用仅是个别名;
●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;
●引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有 的,前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)
●引用不能为空,指针可以为空;
●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
●指针和引用的自增(++)运算意义不一样;
●引用是类型安全的,而指针不是
我网上搜的,希望对你有用{:10_256:} void fun2(TEAC*& pT2)//问题 :指针的引用 还是一个指针吗?从字面上看是pT2的别名,内部结构是啥样的?另一个指针,也指向这个空间吗?
参数列表: TEAC*& pT2 == TEAC pT
为什么呢?个人认为: TEAC & pT2时,指pT2的地址,此时pT2是一个TEAC类型所创建的对像,对像的变量名叫做pT2而已;
*& pT2;相当于把pT2地址解除引用,就是pT2; 此时,需要调用成员的话,应是pT2.show()这样子.
以上对否全靠回忆,还没实验,请大家鉴定. 以下是实验结果,应当可以说明你的问题:
#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: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;
楼主可以试试,可以思考它们的地址是什么?
变量就要有地址.
新指针无论指不指谁,它都有地址,因为它也是变量,指针变量.
组数的本质,就是一组连续的内存,它也是变量,同时也是指针,所以,指针赋给指针,是可行的.当指针(数组中的元素)赋给这个同类型指针时,地址就发生了变化. 可以的话,就赏一个分吧?{:10_282:} howzyao 发表于 2020-4-8 18:56
可以的话,就赏一个分吧?
给你分吧
页:
[1]