C语言 怎样区分指针常量和指针变量?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 怎样区分指针常量和指针变量?相关的知识,希望对你有一定的参考价值。

如有:
char s1[100]="ABC";
char *s2="DEF";

这样以后,s1就是指针变量,s2就是指针常量吗?为什么?
不是说所有的数组名都是指针常量吗?那s1不就是个字符数组名吗,怎么会是变量呢?
还有,定义char * s2以后,我觉得s2应该是指针变量啊,怎么会说他是指针常量呢?

到底应该怎么区分指针常量和指针变量啊,有谁能具体解释一下吗?

区分什么是常量,什么是变量,就是要看它是不是可变的,可变就是变量,不可变就是常量。
char s1[100]="ABC";
数组的内容是可变的,所以是变量,但数组名指向的地址是不可变的,所以是常量
char *s2="DEF";
字符串"DEF"是常量,因为不可变,而s2的值是可变的,是变量
参考技术A

    指针常量的本质是一个常量,并且使用指针来修饰它,那么说明这个常量的值应该是一个指针,其格式应为:int * const p,

    常量指针本质是指针,并且这个指针乃是一个指向常量的指针。其格式为:int const * p或者 const int* p.
    指针常量的值是指针,这个值因为是常量,所以不能被赋值。
    在C/C++中,指针常量这样声明:
    int a;
    int *const p = &a; //const放在指针声明操作符的右侧
    只要const位于指针声明操作符右侧,就表明声明的对象是一个常量,且它的内容是一个指针,也就是一个地址,并且在声明的时候一定要给它赋初始值。一旦赋值,以后这个常量再也不能指向别的地址。
    常量指针的使用要注意,指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改,也就是说常量指针可以被赋值为变量的地址,之所以叫做常量指针,是限制了通过这个指针修改变量的值。

    所以,指针常量和指针变量的区别就是是否使用了const修饰符修饰,凡是有const修饰的指针都是指针常量,否则就是指针变量。

参考技术B 1、常量指针

指向常量的指针变量的定义和使用

如:const int *p;

2、指针常量

如:char* const p = "abcde";

可以这么理解:const p的类型式char*,所以p是不可以再修改的。也就是所p必须是在定义时就已经初始化,并且不能再修改了。

3、指向常量的指针常量

指向常量的指针常量

如:const int* const p = &b;

可以这么理解int* const p的类型时const,那么也就是所int* const p是不可以修改的。

再看int* const p.const p的类型是int*,也就是p是不可以再修改的,并且它的类型是int*.

C 语言const 关键字用法 ( 常量指针 - const 在 * 左边 - 修饰数据类型 - 内存不变 | 指针常量 - const 在 * 右边 - 修饰变量 - 指针不变 )





一、const 普通用法



const 关键字 在 C 和 C++ 中的表现不同 , 本篇博客主要介绍 C 语言中的 const 用法 ;


const 的用法 : 下面的 2 2 2 个写法作用相同 , const 可以在 数据类型 前面 , 也可以在 数据类型 后面 ;

// 下面两个 const 用法相同
const int a;
int const a;




二、常量指针 ( 指向 常量 的指针 | 被指向的内存不能被修改 )



下面的 c 是 指向 常量字符 的指针 , const char 表示 常量字符 , const char * 表示 指向 常量字符 的指针 ;

  • 该指针 指向的 内存空间 不能被修改 ,
  • 指针可以被修改 ;
// 指向 常量字符 的指针 
const char *c;

上述代码 指针指向的 内存 是常量 ; 常量指针





三、指针常量 ( 指针不能被修改 )



下面的 d 是 指向 字符 的 常量指针 , char * 表示一个指向 char 字符的指针 , 后面加上 const 表示该指针 是 常量指针 ;

  • 该指针 指向的 内存空间 可以被修改 ,
  • 指针 不能 被修改 ;
char * const d;

上述代码 指针 是常量 ; 指针常量





三、指向 常量 的 指针常量



下面的 c 是 常量指针 指向一个常量 , 指针 和 指针指向的内存 , 都不能被修改 ;

const char * const c; 




四、const 在 * 左右的意义



普通的数据类型 , const 在数据类型左右作用相同 ;


指针数据类型 , const 在 * 左侧是 常量指针 ( 内存不能修改 ) , const 在 * 右侧是 指针常量 ( 指针不能被修改 ) ;

指针常量与常量指针 : 需要查看 const 修饰的是 指针变量 , 还是 修饰 指针变量 指向的内存空间 ;

  • const 在 * 右边 ( 指针常量 | const 修饰的是变量 ) : const 修饰的是 指针变量 , 如 char * const d , const 修饰的是 char * , 指针不能被修改 ; 这是 指针常量 ;
  • const 在 * 左边 ( 常量指针 | const 修饰的是数据类型 ) : const 修饰的是 指针变量 指向的内存空间 , 如 const char *c , const 修饰的是 char , char 数据不能被修改 , 这是 常量指针 , 指向常量的指针 ;

const 修饰的是右边的内容 ,

  • 右边是 变量 , 相当于 const 在 * 右边 , 指针常量 , 指针不能修改 ;
  • 右边是 数据类型 , 相当于 const 修饰的是 内存中的数据 , 指针指向的内存不能被修改 ;

以上是关于C语言 怎样区分指针常量和指针变量?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中怎样区分一维指针和二维指针?

c语言常量指针赋值给变量指针导致警告

C语言中“指针”和“指针变量”的区别是啥??

C 语言const 关键字用法 ( 常量指针 - const 在 * 左边 - 修饰数据类型 - 内存不变 | 指针常量 - const 在 * 右边 - 修饰变量 - 指针不变 )

C语言指针

C语言 怎样让一个指针的内容传给一个变量