C++中指针赋值原则

1 指针简介

指针(pointer)是指向(point to另外一种类型的复合类型,它实现了对其它对象的间接访问。定义指针类型的方法将声明符写成*d的形式,其中d是变量名,如以下代码声明了一个整形指针:

int *ip1;

2 指针赋值

对指针进行

#include<iostream> #include<string> #include<cctype> using namespace std; #define INFEASIBLE -1 #define OVERFLOW -2 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef char SElemType; typedef char ElemType; struct STACK { SElemType * base; SElemType * top; int stacksize; }; int InitStack(STACK &S); char GetTop(STACK &S); int Push (STACK &S,SElemType e);//插入e为新的栈顶元素 int Pop (STACK &S,STACK &H,int m);//若栈不空,则删除S的栈顶元素 int EmptyStack(STACK &S);//判断栈S是否为空 int cmp(char a,char b);//判断运算符a的优先级是否高于运b void cmp(char a,char b,STACK &f,STACK &h);//判断运算符a和b的优先级 int main() { STACK h1; InitStack(h1);//定义并初始化逆序的逆波兰式栈h1 STACK h2; InitStack(h2);//定义并初始化正序的逆波兰式栈h2 STACK fh; InitStack(fh);//定义并初始化符号栈fh Push(fh,'#');//将#压入符合栈 string z; int a; kind1: cout<<"***************************************"<<endl; cout<<"请输入一个表达式,并以“#”结束:"<<endl; cout<<"***************************************"<<endl; cin>>z; for(int i=0;i<z.size ();i++)//对输入表达式的每个字符进行判断 { if(isalnum(z[i]))//如果当前字符是字母或数字 Push(h1,z[i]);//将当前字符压入逆序的逆波兰式栈h1 else if(z[i]=='(')//如果当前字符是"(" Push(fh,'(');//将当前字符压入符号栈fh else if(z[i]==')')//如果当前字符是")" { while(GetTop(fh)!='(')//一直删除符号栈fh的栈顶元素只至"(" Pop(fh,h1,1); //并将其压入逆序的逆波兰式栈h1 Pop(fh, 、、、、、、、、、、
### C++ 中指的概念与常见问题 #### 指针的基础概念 在C++中,指针是一种变量类型,用于存储另一个变量的地址。通过操作这些地址,可以间接访问和修改数据的内容[^1]。指针的核心特性在于它能够高效地处理动态内存分配以及复杂的数据结构。 #### 基本语法与初始化 定义一个指针时,需指定其指向的数据类型。例如: ```cpp int a = 10; int* p = &a; // 定义了一个整型指针并将其初始化为变量a的地址 ``` 上述代码展示了如何声明一个指向`int`类型指针,并将该指针赋值为变量`a`的地址[^2]。 #### 数组与指针的关系 数组名本质上是一个常量指针,表示数组首元素的地址。可以通过指针遍历整个数组中的元素。以下是一段典型的例子: ```cpp #include <iostream> using namespace std; int main() { int arr[5] = {1, 2, 3, 4, 5}; int *p = arr; // 将指针p初始化为数组arr的起始位置 for (int i = 0; i < 5; i++) { cout << *(p + i) << " "; // 输出数组中的每一个元素 } } ``` 此程序利用指针算术运算实现了对数组内容的逐项读取[^3]。 #### 函数指针的应用场景 除了基本用途外,C++还支持函数指针这一高级功能。它可以用来保存某个函数入口地址,从而实现回调机制或者优化性能密集型算法的设计。 假设存在两个简单加减法函数,则可通过如下方式设置对应的函数指针: ```cpp double add(double x, double y){return x+y;} double substract(double x,double y){return x-y;} typedef double (*MathOperation)(double ,double ); void performCalculation(MathOperation op){ cout<<op(3.5,-2)<<endl;//执行传入的操作符 } // 调用示例 performCalculation(add); performCalculation(subtract); ``` #### Qt框架下的智能指针简介 现代C++开发提倡使用RAII(Resource Acquisition Is Initialization)原则来简化资源管理流程。Qt库为此提供了多种内置解决方案——其中最常用的就是共享所有权模型代表QSharedPointer[^4]。这类工具可以帮助开发者有效规避传统裸指针可能引发的各种隐患如悬垂引用、双重释放等问题。 #### 关于NULL指针异常的安全防护措施 实际编程过程中经常会遇到因未正确验证输入而触发崩溃的情况之一便是非法解引用null pointer。因此建议始终遵循良好习惯,在任何尝试解除之前都应确认目标确实合法非零状态。比如这样写更稳妥些: ```cpp if(nullptr != ptr && isValid(ptr)){ doSomething(*ptr); }else{ handleError(); } ``` 另外值得注意的是某些编译器选项也可能影响最终行为表现所以最好查阅官方文档获取最新指导信息[^5]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值