指向变量的常指针与指向常变量的指针详细解析_C 语言

常(量)指针
常指针就是我们说的指向常量的指针,顾名思义,它是用来指向常量的。

用常指针指向常变量
实际上,C++规定只能用指向常变量的指针指向常变量,普通指针指向它就会报错,原因也很容易理解,我们用普通指针指向常变量之后,有可能就会进行改变常变量数值的操作,这样做是不被允许的。

常指针的定义方法:

复制代码 代码如下:

const 类型名  * 常指针名;

下面是它的一个简单的使用示例:
程序1.1.1

复制代码 代码如下:

#include<iostream>
using namespace std;
int main()
{
 const int i=5;//定义一个int型常变量
 const int *p;//定义一个int型常指针
 p=&i;//用常指针指向常变量
 cout<<*p<<endl;
 return 0;
}

运行结果:

如果我们使用普通指针变量来指向常变量:
程序1.1.2

复制代码 代码如下:

#include<iostream>
using namespace std;
int main()
{
 const int i=5;//定义一个常变量
 int *p;//定义了一个int型指针
 p=&i;//使用一般的指针指向常变量
 cout<<*p<<endl;
 return 0;
}

就会报错:

用常指针指向一般变量(非const型变量)
用常指针也是可以指向一般变量的,不过不可以通过常指针来更改一般变量的值,但是可以通过一般变量的变量名来修改变量的值。
下面看一个示例:

程序1.2.1

复制代码 代码如下:

#include<iostream>
using namespace std;
int main()
{
 int i=5;//定义一个一般变量
 const int *p;//定义了一个常指针
 p=&i;//使用常指针指向一般变量
 cout<<*p<<endl;
 i=10;//通过一般变量的变量名来修改值
 cout<<*p<<endl;
 return 0;
}

运行结果:

如果我们使用常指针来修改一般变量的值:

复制代码 代码如下:

*p=10;

就会报错:

小结:常指针可以指向常变量和一般变量,但是都不能通过指针改变它指向的变量的值。

指针常量
指针常量是指的指针本身就是一个常变量,一经赋初值就不可以被更改。
上面已经说过,只有常指针才可以指向常变量,所以指针常量只可以指向一般变量,而且一旦赋给了初值,就不可以再更改。

定义方法:

复制代码 代码如下:

类型名 * const 指针常量名=变量地址;

因为指针是常变量所以它在定义的时候就应该赋初值。

一个程序示例:

程序2.1

复制代码 代码如下:

#include<iostream>
using namespace std;
int main()
{
 int i=5;//定义一个一般变量
 int * const p=&i;//定义了一个指针常量
 cout<<*p<<endl;
 *p=30;//通过指针来改变指向的变量的值
 cout<<*p<<endl;
 return 0;
}

运行结果:

时间: 2024-10-03 02:05:33

指向变量的常指针与指向常变量的指针详细解析_C 语言的相关文章

数组指针、指针数组以及二位数组的深入解析_C 语言

int *p[3]与int (*p)[3]的区别*p[3]这个是一个指针数组,它所代表的意思是数组中的每一个元素都是一个指针变量,而(*p)[3],p是一个指针变量,表示指向一个含有3个整型元素的一维数组. 复制代码 代码如下: int i,j;    int a[2][3]={3,4,5,6,7,8}; //    int *p[3] ;  //表示一个数组,数组中的元素是指针类型,一共有三个元素    int (*q)[3]; //是一个指针,指向一个含有三个int型的数组(q+1)会跳三个

C++指向类成员函数的指针详细解析_C 语言

首先 函数指针是指向一组同类型的函数的指针:而类成员函数我们也可以相似的认为,它是指向同类中同一组类型的成员函数的指针,当然这里的成员函数更准确的讲应该是指非静态的成员函数.前者是直接指向函数地址的,而后者我们从字面上也可以知道 它肯定是跟类和对象有着关系的. 函数指针实例: 复制代码 代码如下: typedef int (*p)(int,int);//定义一个接受两个int型且返回int型变量的函数指针类型int func(int x,int y){ printf("func:x=%d,y=%

变量定义与声明的区别详细解析_C 语言

我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下: 变量的声明有两种情况:(1) 一种是需要建立存储空间的(定义.声明).例如:int a在声明的时候就已经建立了存储空间. (2) 另一种是不需要建立存储空间的(声明).例如:extern int a其中变量a是在别的文件中定义的. 前者是"定义性声明(defining declaration)"或者称为"定义(

C语言的指针类型详细解析_C 语言

指针存储了内存的地址,同时指针是有类型的,如int*,float*,那么,一个自然的猜想就是指针变量应该存储这两方面的信息:地址和指针类型,比如,就像下面的结构体: 复制代码 代码如下: struct pointer{    long address;    int type;} 举个例子:打印sizeof(int*),值为4,可见4字节是存储内存地址用的,反过来就说明指针并没有存储类型信息的地方,那么指针的类型信息存放在哪儿呢?下面剖析一段简单的代码. 复制代码 代码如下: // ma.cpp

C#委托所蕴含的函数指针概念详细解析_C 语言

原则: 1.函数指针,实际上是函数编码后的指令在内存中的首地址,在C++/C中,这个地址可以用函数名直接使用 一个函数调用另一个函数的时候,就可以把被调用函数以函数指针的形式作为参数传入 2.回调函数callback使用的技术就是函数指针: 回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用.为此,你需要做三件事: 1). 声明: 2). 定义: 3). 设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于DLL调用. 回调函数是应用程序提供给Windo

C++ 在堆上开辟与释放二维、三维指针详细解析_C 语言

学习C++新手通常会对指针的使用比较头疼,其实指针的概念很简单,只要能悟清楚这样一个简单的道理就能对指针有一定的认识了: 例如 int *a = new int[10]; 一维指针其实就相当于一维数组,不用去看书上所说的数组在内存中的首地址这些晦涩的话,以此类推 二维指针就相当于二维数组,新手对一维数组的开辟与释放比较容易熟悉,例如上面的a 释放就是 delete []a; a = NULL; 注意a = NULL; 必须要加上,这样是为了避免这个指针会变成"野指针".写程序时一定要注

C++指向函数的指针实例解析_C 语言

通常来说C++函数指针是指指向函数的指针,而非指向对象的指针.就像其他指针一样,函数指针也指向某个特定的类型.函数类型由其返回类型以及形参表确定,而与函数名无关. 定义: char (*fP)(char,int); 赋值: char function(char i,int j) { } fp=function; 调用 (*fp)(10,100); type char (*FUN)(char,int);//类型定义 FUN fp ;//定义fp为指向函数的指针 volatile的用法和作用: co

C++中对象的常引用、动态建立和释放相关知识讲解_C 语言

C++对象的常引用 我们知道,一个变量的引用就是变量的别名.实质上,变量名和引用名都指向同一段内存单元. 如果形参为变量的引用名,实参为变量名,则在调用函数进行虚实结合时,并不是为形参另外开辟一个存储空间(常称为建立实参的一个拷贝), 而是把实参变量的地址传给形参(引用名),这样引用名也指向实参变量. [例] 对象的常引用. #include <iostream> using namespace std; class Time { public: Time(int,int,int); int

C++编程中的函数指针初步解析_C 语言

1.定义每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针.2.语法指向函数的指针变量的一般定义形式为: 数据类型 (*指针变量名)(参数表);3.说明1) 函数指针的定义形式中的数据类型是指函数的返回值的类型. 2) 区分下面两个语句: int (*p)(int a, int b); //p是一个指向函数的指针变量,所指函数的返回值类型为整型 int *p(int a, int b); //p是函数名,此函数的返回值类型为整型指针 3) 指向函数的指针变量不是