1
指针简介
指针(
pointer
)是
“
指向(
point to
)
”
另外一种类型的复合类型,它实现了对其它对象的间接访问。定义指针类型的方法将声明符写成
*d
的形式,其中
d
是变量名,如以下代码声明了一个整形指针:
int *ip1;
2
指针赋值
对指针进行赋值只能使用以下四种类型的值:(
1
)空指针(
2
)类型匹配的对象的地址(
3
)同类型的另一个有效指针(
4
)另一对象之后的下一地址。
2.1
空指针
空指针(
null pointer
)不指向任何对象。
(
1
)赋值为空指针
有以下几种方法可以将指针赋值为空指针。
int *p1 = nullptr;
int *p2 = 0;
int *p3 = NULL;
其中,
nullptr
是
C++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 另一对象之后的下一地址
指针(pointer)是“指向(point to)”另外一种类型的复合类型,它实现了对其它对象的间接访问。定义指针类型的方法将声明符写成*d的形式,其中d是变量名,如以下代码声明了一个整形指针:int *ip1;
#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++
指针
详解
与数据一样,函数也有地址,函数的地址是内存
中
存放函数语言代码的起始地址。函数
指针
是指向这个地址。函数
指针
所指向的
类型
,是函数本身。我们知道,
指针
所指向
类型
代表了
指针
所指向的内存区域的大小。所以函数
指针
所指向的
类型
,是函数在内存
中
所占据内存的大小。知道了函数的起始地址和大小,所以函数
指针
可以很轻易的代替函数完成函数调用。
一、简单的函数
指针
变量都包括声明和
赋值
,
指针
不例外,函数
指针
也不例外
用变量地址作为初值时,该变量必须在
指针
初始化之前已声明过,且变量
类型
应与
指针
类型
一致。
可以用一个已有合法值的
指针
去初始化另一个
指针
变量。
不要用一个内部非静态变量去初始化 static
指针
。
指针
变量的
赋值
运算
指针
...
C++
中
指针
和引用的区别
指针
和引用在
C++
中
很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法。
1.
指针
和引用的定义和性质区别:
(1)
指针
:
指针
是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:
int a=1;int *p=&a;
int a=1;int &b=a;
上面定义了一个整形变量和一个
指针
变量p,该
指针
变量指向a的存储单元,即p的值是a存储单元的地址。
而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个
int * pr = 2233;//错误,pr可能是已经使用的地址,现在代表2233.会引发系统bug
int * pr = new int;//正确,为
指针
开辟空间,并把地址给pr
* pr =2233;//把2233的值放入空间
中
。
delete pr;//删除
指针
char * pr = "字符串";//正确,因为系统提前把带""的字符串放入一块内存
//所以"字符串"有地址和值,能够直接把地址给pr
写一个用到
指针
的程序时,被拷贝、
赋值
、析构函数坑了一波,网上查相关博客,发现关于拷贝、
赋值
构造函数调用时机大多都有错误,因此决定自己总结撸一发博客。
A (A& a); //拷贝构造函数
A (const A& a); //拷贝构造函数
A& operator= (const A&am...
在
C++
中
,
指针
是一种变量,用于存储其他变量的内存地址。
指针
变量包含一个内存地址,可以让我们访问该地址处存储的数据。通过使用
指针
,可以直接操作内存,提高程序的灵活性和效率。
要声明一个
指针
变量,需要在变量名前加上星号(*)。例如,int* ptr; 声明了一个指向整数的
指针
变量ptr。该
指针
变量可以存储一个整数变量的内存地址。
要获取变量的地址,可以使用取地址运算符(&)。例如,int num = 10; int* ptr = # 将num的地址
赋值
给
指针
变量ptr。
要访问
指针
所指向的值,可以使用解引用运算符(*)。例如,int num = 10; int* ptr = # *ptr = 20; 将会把20
赋值
给num。
指针
还可以用于动态分配内存,通过使用new关键字来创建动态对象。例如,int* ptr = new int; 在堆上分配了一个整数,并将其地址
赋值
给
指针
变量ptr。使用完后,需要使用delete运算符释放内存,避免内存泄漏。
总之,
指针
在
C++
中
是一种重要的概念,可以用于直接操作内存地址,访问和修改变量的值,以及进行动态内存分配。