添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
知识渊博的刺猬  ·  GitHub - ...·  6 月前    · 
强健的鸭蛋  ·  Ngày Hội Tiếng Anh ...·  12 月前    · 

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&amp; a); //拷贝构造函数 A (const A&amp; a); //拷贝构造函数 A&amp; operator= (const A&am...
C++ 指针 是一种变量,用于存储其他变量的内存地址。 指针 变量包含一个内存地址,可以让我们访问该地址处存储的数据。通过使用 指针 ,可以直接操作内存,提高程序的灵活性和效率。 要声明一个 指针 变量,需要在变量名前加上星号(*)。例如,int* ptr; 声明了一个指向整数的 指针 变量ptr。该 指针 变量可以存储一个整数变量的内存地址。 要获取变量的地址,可以使用取地址运算符(&)。例如,int num = 10; int* ptr = &num; 将num的地址 赋值 指针 变量ptr。 要访问 指针 所指向的值,可以使用解引用运算符(*)。例如,int num = 10; int* ptr = &num; *ptr = 20; 将会把20 赋值 给num。 指针 还可以用于动态分配内存,通过使用new关键字来创建动态对象。例如,int* ptr = new int; 在堆上分配了一个整数,并将其地址 赋值 指针 变量ptr。使用完后,需要使用delete运算符释放内存,避免内存泄漏。 总之, 指针 C++ 是一种重要的概念,可以用于直接操作内存地址,访问和修改变量的值,以及进行动态内存分配。