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

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

被折叠的 条评论
为什么被折叠?



