目录
Const的五种使用情况
const在C与C++中是不同的,
先看两种写法:
const int a;
int const b;
这两种写法都是对的,也是一样的,代表一个整型变量不能被修改。
再看:
const char *c;
char * const d;
这两种写法也是对的,但代表的意义是不一样的。其中,c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改);d 是一个常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)等同于定义一个"char buf[100]"
总结:先要明白指针变量和它所指向的内存空间变量,是两个不同的概念,那么看const的时候,就看是针对的是指针变量还是针对的是指针变量指代的内存空间。
看const 是放在*的左边还是右边 看const是修饰指针变量,还是修饰所指向的内存空变量
还有最后一个用法:
const char * const e ;
这么写,意味着e是一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)
下面举例说明:
void getmeml201(const char *p)
{
p = 1;
p = 3;
//指针指向的内存空间不能被修改
p[1] = 'a'; //报错
return;
}
这段代码和上面的变量d是一种情况,指针指向的内存空间不能被修改,所以,在这段代码中修改p本身这个指针变量,是不会报错的,但修改p[1],即p指向的内存空间,就会报错。
同理,把const修改是部分变成指针变量,上面的这种情况,就正好反了过来:
void getmeml202(char const *p)
{
p = 1; //报错
p = 3; //报错
//
p[1] = 'a';
return;
}
要是,都给const住了,就只能拿值,不能改值了:
void getmeml203(const char const *p)
{
//p = 1; //报错
//p = 3; //报错
//p[1] = 'a';
printf("%c", p[1]);
return;
}
Const的使用本质
那么下面再看一个:
void main()
{
const int a = 10;
a = 11;
printf("hello...\n");
system("pause");
return ;
}
这样是不能被修改的,因为a被const给限定了,但是:
void main()
{
int *p = &a;
*p = 100;
printf("a:%d", a);
printf("hello...\n");
system("pause");
return ;
}
通过引用指针的方式,再去改变a,竟然成功了!这说明,在C语言里面,const是一个伪命题,是一个冒牌货,并非如我们所想象的那样稳定,C语言中的const修饰的变量,是假的!
总体代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
void getmeml201(const char *p)
{
p = 1;
p = 3;
//指针指向的内存空间不能被修改
//p[1] = 'a';
return;
}
void getmeml202(char const *p)
{
//p = 1; //报错
//p = 3; //报错
p[1] = 'a';
return;
}
void getmeml203(const char const *p)
{
//p = 1; //报错
//p = 3; //报错
//p[1] = 'a';
printf("%c", p[1]);
return;
}
void main01()
{
char *p1 = NULL;
const char *p2 = NULL;
p2 = 1;
return;
}
void main()
{
const int a = 10;
a = 11;
{
int *p = &a;
*p = 100;
printf("a:%d", a);
}
printf("hello...\n");
system("pause");
return ;
}
来源:CSDN
作者:恋蛩音
链接:https://blog.csdn.net/qq_17846375/article/details/103832813