C语言结构体指针

本文深入探讨指针初始化的重要性,解析错误代码可能导致的问题,并详细讲解结构体与指针结合使用的正确方式,包括结构体指针和二级指针的运用。
1.指针初始化(迫切

错误代码:

int * point;    //  定义一个指针变量
*point = 1;  // 将 1 赋给指针指向的内存

问题:由于 point 指针未初始化, point 的值为任意值,它可能指向一段重要的程序代码,接着对 point 指针的赋值语句则改写了 point 指向内存中的内容,这是极其危险的。


当定义了一个int型的指针变量p时,系统会在栈里面自动为p分配内存空间,注意是为p分配内存空间!!!而此时p指向的内存地址是0(或者是一个其他的地址值,根据不同的编译器而定).此时若对p进行解引用操作,能通过编译,因为p确实有一个指向的地址,但是这个地址是错误的,或者说是无意义的,所以再运行的时候会出错.
举一个例子,int *a;
中间若干语句之后执行
*a =1;
请问这样运行之后程序会出现什么结果,很多人都认为a这个指针最后指向了1,但实际上并不是,如果你运气好,给你分配一个空地址,运气不好,程序直接崩溃,会提示你内存错误。也就是,你这些程序根本就没有指向内存。为什么呢,因为你首先声明了一个指针,但是没有初始化就赋值了,这是不合法的,没有初始化的情况下,a指向哪里完全由操作系统决定,如果操作系统的机制不够成熟,那么这就是一个野指针,指向了一块非法内存地址。所以,一定要初始化,否则后患无穷.

2.结构体指针
typedef struct BiTNode{
    int data;
} BiTNode, *BiTree;

(1)首先,我们先实验BiTNode
         1.在主程序中输入以下代码

int main(){
	   BiTNode a;
	   a.data=1;
	   printf("a的值为%d\n",a.data);
}

         这样使用结构体是可以的


         2.把.换成->,在主程序中输入以下的代码:

int main(){
	  BiTNode a;
	  a->data=1;
}

         这样不行,编译器会报错。


总结一下,BiTNode所创建的结构体,只能用” . ”来访问结构体中的元素。
(2)然后,我们实验BiTree
         1.在主程序中输入以下代码

int main(){
	   BiTNode a; 
	   BiTree b;
	   b=&a;//指针必须初始化
	   b->data=123;
	   printf("b的值为%d",b->data);
}

         我们创建了一个结构体指针,结构体指针可以用->来访问结构体中的元素


         2.把->换成.,在主程序中输入以下的代码:

int main(){
	BiTNode a; 
	BiTree b;
	b=&a;
	(*b).data=234;
	printf("b的值为%d",(*b).data);
}

         这样使用结构体指针也可以


总结一下,BiTree所创建的结构体指针,既可以使用->访问结构体中的元素,也可以用(*p).来访问结构体中的元素
(3)使用BiTree *创建元素(二级指针)
         在主程序中输入以下代码

int main(){
	BiTNode a;
	BiTree b; 
	BiTree *c;
	b=&a;
	c=&b;
	printf("c所在内存地址是%#X\n",&c);
	printf("c中所存储的地址是%#X\n",c);
	printf("b所在内存地址是%#X\n",&b);
	printf("b中所存储的地址是%#X\n",b);
	printf("a所在内存地址是%#X\n",&a);
}

输出结果为:
c所在内存地址是0x22FE30
c中所存储的地址是0x22FE38
b所在内存地址是0x22FE38
b中所存储的地址是0x22FE40
a所在内存地址是0x22FE40
23333


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值