C/C++——指针

更新时间:2019-12-03 11:02:42点击次数:323次
C/C++——指针
指针(pointer)就是内存单元的地址,它可能是变量的地址,也可能是函数的入口地址。如果指针变量存储的地址是 变量的地址,则称该指针为变量的指针(或变量指针);如果指针变量存储的地址是函数的入口地址,则称该指针为函数的指针(或函数指针)。

1.指针变量的定义
指针类型的变量是用来存放内存地址的。其一般定义格式为:

<类型标识符> * <标识符>

(1)标识符前面的“*”,表示该标识符为指针变量,但“*”不是变量名的一部分。
(2)一个指针变量只能指向同一个类型的变量。

1) 两个指针运算符

(2)运算符&:一个单目操作符,返回的是变量存储单元的地址。

(2) 运算符*:一个单目操作符,返回的是指针变量所指地址的内容。

2)两种给指针变量赋值的方式

(1)定义时初始化

int a;
int *p=&a; //定义时初始化

(2)利用赋值语句

int a;
int *p;
p=&a;

不允许把一个整数赋予指针变量,例如:

int *p;
p=50; //ERROR:不能将一个整型数赋值给指针变量

2.指针变量的使用

定义了指针变量后就可以使用了。

#include <iostream>
using namespace std;
int main()
{
int a,b;
b = 50;
int *p = &a;
*p = 100; //等价于a=100
p = &b; //p指向了另一个整型变量b,则*p等价于变量b
cout << a << endl;
cout << *p << endl;
return 0;
}

*p=&a; //ERROR:不能将“int*”类型的值分配到int类型的实体

3.void类型指针

如果指针类型是void*类型,则可以与任意数据类型匹配。void指针在被使用之前,必须转换为正确的类型。

#include <iostream>
using namespace std;

int main()
{
void * p;
int a = 5;
p = &a; //p指向整型变量a
cout << "a=" << *p << endl; //ERROR:表达式必须是指向完整类型的指针
cout << "a=" << *(int * )p << endl;
return 0;
}

在C++中,有的头文件定义了一个常量NULL(值为0),表示不指向任何内存单元。可以把NULL常量赋给任意类型的指针变量,初始化指针变量。

int * ptr = NULL;

全局指针变量被自动初始化为NULL,局部指针变量的初值时随机的。未初始化的指针可能是一个非法的地址,导致程序运行时出现“segmentation fault”,“bus error”,“system error”等,导致程序终止运行。

4.指针常量与常指针

1)指针常量

在定义指针变量时,指针变量前用const修饰,被定义的指针变量就是一个指针类型的常变量,指针类型的常变量简称为指针常量。

数据类型 * const 指针变量 = 变量名;

const修饰的是指针变量,而不是指针所指向的值。所以指针指向的值可以被更改,而指针变量的指向是不可以更改的。

#include <iostream>
using namespace std;
int main()
{
  int a, b;
  int * const p = &a; //定义指针常量p指向a
  a = 5;
  b = 6;
  cout << *p << endl; //输出5
  a = 7;
  cout << *p << endl; //输出7
  p = &b; //ERROR:表达式左边必须是可修改的值
  cout << *p << endl;
  return 0;
  }

2)常指针
在定义指针变量时,数据类型前用const修饰就定义了指向常量的指针变量,简称为常指针。
** const 数据类型 * 指针变量 = 变量名;**
数据类型 const * 指针变量 = 变量名;
== 定义一个常指针后,就不能通过常指针修改常指针所指向的值,即不能通过指针变量间接更改指针指向的值。==

  const char * p = "123456"; //定义了一个常指针
  *p = "abc"; //ERROR:试图修改指针指向的值

为了避免通过一个非常指针修改常指针的值,将一个常指针赋给一个非常指针是错误的

 #include <iostream>
using namespace std;
int main()
{
int a = 5, b = 10;
int const *p2;
int *p1 = &a;
p2 = p1;
cout << "p1 = " << *p1 << endl; //p1=5
cout << "p2 = " << *p2 << endl; //p2=5
p1 = &b;
cout << "p1 = " << *p1 << endl; //p1=10
cout << "p2 = " << *p2 << endl; //p2=5 ,常指针指向的值未变
p1 = p2; //ERROR:不能将一个常指针赋给一个非常指针
return 0;
}

3)常指针常量
const 数据类型 * const 指针变量 = 变量名 ;
数据类型 const * const 指针变量 = 变量名 ;

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息