大佬教程收集整理的这篇文章主要介绍了我的改错日常----指针的使用,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
// 例1
int a = 0;
void changeA(int *pa)// 传入更高一级指针
{
*pa = 10; // 采用解引用修改值
}
changeA(a);
// 例2
int *b = NULL;
void changeB(int **pb) // 传入更高一级指针
{
*pb = (int*)malloc(sizeof(int)); // 采用解引用修改值
}
changeB(&b);
// 等于例2
int *b = NULL;
b = (int*)malloc(sizeof(int));
@H_262_2@建议:不要使用指针。
@H_262_2@在你没有完全搞明白指针的时候,建议避免使用指针。可以使用全局变量、通过返回值修改原来的值、C++中函数传入引用等等。如果无法避免,不要使用过高级的指针。
// 自定义数据类型
typedef char DataType;
// 二叉树的定义
typedef struct Node
{
DataType data; // 数据
struct Node* LChild; // 左子树
struct Node* RChild; // 右子树
}BiTNode,*BiTree; //BiTNode:二叉树类型 BiTree:指针类型
/*
* 建立二叉树
* 采用类似先序遍历的方式建立二叉树。
* 首先读入的是当前根节点的数据,如果是“.”,则将当前树的根置为空,否则申请一个新节点,
* 存入当前的数据,分别用用当前节点的左子域和右子域进行递归调用创建左子树右子树。
*/
void CreateBiTree(BiTree* bt)
{
char ch;
ch = getchar();
if (ch == '.') *bt = NULL;
else {
(*bt) = (BiTreE)malloc(sizeof(BiTNodE));
if ((*bt) != NULL) { // C6011警告 C++ malloc申请的节点使用前先判空
(*bt)->data = ch;
CreateBiTree(&((*bt)->LChild));
CreateBiTree(&((*bt)->RChild));
}
}
}
@H_262_2@然而我是这样调用的:
// 初始化二叉树
void InitBiTree(BiTree* bt)
{
bt = (BiTree*)malloc(sizeof(BiTreE));
}
int main()
{
BiTree* tree = NULL;
InitBiTree(treE);
CreateBiTree(treE);
}
@H_262_2@出现如下报错
@H_262_2@@H_262_2@当然CreateBiTree(BiTree* bt)函数是没有任何问题的,问题就出在InitBiTree(treE)上,但是确实使用InitBiTree给tree初始化分配空间了,而且传入的是指针。但是为什么tree是nullptr呢?这时候请看回头看守则1与守则2。为什么会报错?因为TRee没有指向的空间,守则1不满足。为什么tree没有指向分配的空间?因为TRee的值没有修改,而修改指针的值,请参照守则2,必须传入更高一级的指针。InitBiTree(treE)不满足守则2。
#include<iostream>
#include <stdio.h>
#include <stdlib.h>
// 自定义数据类型
typedef char DataType;
// 二叉树的定义
typedef struct Node
{
DataType data; // 数据
struct Node* LChild; // 左子树
struct Node* RChild; // 右子树
}BiTNode,*BiTree; //BiTNode:二叉树类型 BiTree:指针类型
/*
* 建立二叉树
* 采用类似先序遍历的方式建立二叉树。
* 首先读入的是当前根节点的数据,如果是“.”,则将当前树的根置为空,否则申请一个新节点,
* 存入当前的数据,分别用用当前节点的左子域和右子域进行递归调用创建左子树右子树。
*/
void CreateBiTree(BiTree* bt)
{
char ch;
ch = getchar();
if (ch == '.') *bt = NULL;
else {
(*bt) = (BiTreE)malloc(sizeof(BiTNodE));
if ((*bt) != NULL) { // C6011警告 C++ malloc申请的节点使用前先判空
(*bt)->data = ch;
CreateBiTree(&((*bt)->LChild));
CreateBiTree(&((*bt)->RChild));
}
}
}
void InitBiTree(BiTree **bt)
{
// 分配空间
*bt = (BiTree*)malloc(sizeof(BiTreE));
}
int main()
{
BiTree* tree = NULL;
InitBiTree(&treE);
CreateBiTree(treE);
return 0;
}
@H_262_2@声明BiTree* tree = NULL;后需要对其进行修改,即分配内存,如使用函数调用的方式参考守则2,必须传入更高一级指针。而且赋值时采用解引用的方式,即*变量名的方式。
#include<iostream>
#include <stdio.h>
#include <stdlib.h>
// 自定义数据类型
typedef char DataType;
// 二叉树的定义
typedef struct Node
{
DataType data; // 数据
struct Node* LChild; // 左子树
struct Node* RChild; // 右子树
}BiTNode,*BiTree; //BiTNode:二叉树类型 BiTree:指针类型
/*
* 建立二叉树
* 采用类似先序遍历的方式建立二叉树。
* 首先读入的是当前根节点的数据,如果是“.”,则将当前树的根置为空,否则申请一个新节点,
* 存入当前的数据,分别用用当前节点的左子域和右子域进行递归调用创建左子树右子树。
*/
void CreateBiTree(BiTree* bt)
{
char ch;
ch = getchar();
if (ch == '.') *bt = NULL;
else {
(*bt) = (BiTreE)malloc(sizeof(BiTNodE));
if ((*bt) != NULL) { // C6011警告 C++ malloc申请的节点使用前先判空
(*bt)->data = ch;
CreateBiTree(&((*bt)->LChild));
CreateBiTree(&((*bt)->RChild));
}
}
}
int main()
{
BiTree tree = NULL;
CreateBiTree(&treE);
return 0;
}
@H_262_2@声明BiTree tree = NULL;这时候tree本身有地址,但是没有指向的地址。CreateBiTree(&treE);传入tree的地址,使用解引用“ *bt = NULL; ” ,“ (*bt) = (BiTreE)malloc(sizeof(BiTNodE)); ”等来修改tree符合守则2。所以正确。@H_262_2@两个程序最重要的区别就是tree的类型不同。
#include<iostream>
#include <stdio.h>
#include <stdlib.h>
// 自定义数据类型
typedef char DataType;
// 二叉树的定义
typedef struct Node
{
DataType data; // 数据
struct Node* LChild; // 左子树
struct Node* RChild; // 右子树
}BiTNode,*BiTree; //BiTNode:二叉树类型 BiTree:指针类型
/*
* 建立二叉树
* 采用类似先序遍历的方式建立二叉树。
* 首先读入的是当前根节点的数据,如果是“.”,则将当前树的根置为空,否则申请一个新节点,
* 存入当前的数据,分别用用当前节点的左子域和右子域进行递归调用创建左子树右子树。
*/
void CreateBiTree(BiTree* bt)
{
char ch;
ch = getchar();
if (ch == '.') *bt = NULL;
else {
(*bt) = (BiTreE)malloc(sizeof(BiTNodE));
if ((*bt) != NULL) { // C6011警告 C++ malloc申请的节点使用前先判空
(*bt)->data = ch;
CreateBiTree(&((*bt)->LChild));
CreateBiTree(&((*bt)->RChild));
}
}
}
int main()
{
BiTree *tree = NULL;
tree = (BiTree*)malloc(sizeof(BiTreE)); // 直接分配,不使用初始化函数。
CreateBiTree(treE);
return 0;
}
以上是大佬教程为你收集整理的我的改错日常----指针的使用全部内容,希望文章能够帮你解决我的改错日常----指针的使用所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。