结构体小结

本文是对C语言中结构体的回顾,强调结构体作为指针和对象时的不同行为。结构体作为指针,形参和实参指向同一地址,修改将影响所有引用。而作为对象,形参和实参可能指向不同地址,栈中的修改不会影响实参。
摘要由CSDN通过智能技术生成

好久没用C编程了,小结一下结构体,原来记得很明白的,现在都快忘光了。

结构体是指针的,形参,实参指向同一块地址,在任何地方更改结构体的内容都会导致内容的改变。

结构体是对象的,形参,实参指向不同的地址,在实参栈中改变数值大小不会对实参产生影响。

#include <iostream>
using namespace std;

typedef struct {
	
	int a;
	int b;
}StrObject,*StrPointer;  // 

void Change(StrObject st)
{
	st.a=99;
	
}
void Change2(StrPointer P)
{
	P->a=99;
}
int main()
{
	StrObject Obj;
	Obj.a=1;
	Obj.b=2;
	Change(Obj);
	cout<<"结构体指针 内容指向不同地址 数值没有发生改变 :"<<Obj.a<<endl;	
	
	StrPointer P;
	P->a=1;
	P->b=2;
	Change2(P);
	cout<<"结构体指针 内容指向同一块地址 数值发生改变 : "<<(P->a)<<endl;
	
	
}


有些疑问的是,定义结构体之后,使用typedef定义结构体对象和结构体指针时,实参和形参都指向同一块地址。。。。

#include <iostream>
using namespace std;
struct Start
{
	int a;
	int b;
	
};
typedef Start *P,P2;

Start* TextPointer(Start *St);
Start TextObject(Start St);
int main()
{
	P A,B; // 指针 
	A->a=1;
	A->b=2;
	//B=A;
//	cout<<(B->a)<<"  "<<(B->b)<<endl;
	
	P2 C,D; // 实参 
	C.a=1;
	C.b=2; 
	//D=C;
//	cout<<D.a<<endl;
	
	TextPointer(A);	
	TextObject(C);
	cout<<(A->a)<<endl;
	cout<<(C.a)<<endl; 
}
Start* TextPointer(Start *St)
{
//	cout<<St->a<<endl;
//	cout<<St->b<<endl;
	St->b=8;
	return St;
}
Start TextObject(Start St)
{
//	cout<<St.a<<endl;
//	cout<<St.b<<endl;
	St.b=8;
	return St; 
}


指针函数的另一种方法:
#include <iostream>
using namespace std;

typedef void (*Fuc)(void *pare);  //定义指针函数 
Fuc FucArg[10];                   //声明指针函数数组 
void A(void *pare){
	
	cout<<"A"<<endl;
}
void B(void *pare){
	
	cout<<"B"<<endl;
}
int main()
{
	FucArg[0]=A;
	FucArg[1]=B;
	FucArg[0](NULL);    // 调用指针函数 
	FucArg[1](NULL);
	
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>