C++中指针赋值原则

原博客地址: https://blog.csdn.net/hou09tian/article/details/73304756


指针简介

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

int *ip1;

指针赋值

对指针进行赋值只能使用以下四种类型的值:(1)空指针(2)类型匹配的对象的地址(3)同类型的另一个有效指针(4)另一对象之后的下一地址。

2.1 空指针

空指针(null pointer)不指向任何对象。

1)赋值为空指针

有以下几种方法可以将指针赋值为空指针。

int *p1 = nullptr;

int *p2 = 0;

int *p3 = NULL;

其中,nullptrC++11新标准刚刚引入的一种方法。

2)不能赋值为整形变量,但是可以赋值为整形常量

把整形变量直接赋给指针是错误的操作,如

int zero = 0;

int *p1 = zero;

如果将zero声明为常量值,则可以用其对指针进行赋值:

const int zero = 0;

int *p1 = zero;

(3)未定义的指针

如果只是声明了一个int指针,而未对其进行定义,如

int *p4;

则此时该指针的值是0xCCCCCCCC,如图2-1所示。

 

2-1 空指针与未定义指针

2.2 类型匹配的对象的地址

可以将指针赋值为其类型匹配的对象的地址。

int one = 1;

int *p5 = &one;

从图2-2中可以看到,此时p7的值是0x005CFB98,而0x005CFB98的内存中保存的值是4个字节的int类型的数据,其值为1

 

2-2 类型匹配的对象的地址

2.3 同类型的另一个有效指针

可以将指针赋值为同一类型的另一个有效指针。

int *p6 = p5;

此时,可以从图2-3中看到,p6的值与p5的值相同,都是0x005CFB98

 

2-3 同类型的另一个有效指针

2.4 另一对象之后的下一地址

还可以将指针赋值为同类型对象的下一个地址。

int *p7 = p5+1;

从图2-4中可以看到,p7的值是0x005CFB9C,也就是p5的值0x005CFB98加上4个字节。

 

2-4 另一对象之后的下一地址


#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, 、、、、、、、、、、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值