const关键字
const在C/C++中用来指定某一变量为常量,const修饰变量的情况较容易理解,比如:
const int a = 500;/*指定a为常量50,0,a的值不可以再被改变*/
a = 400;//编译的时候会报错 ,a的值不能再被改变
关于const对于指针的修饰有下面四种情况
- int b = 500; const int *a = &b;
- int b = 500; int const *a = &b;
- int b = 500; int * const a = &b;
- int b = 500; const int * const a = &b;
修饰指针所指向的内存单元
其中1、2中情况一样,当const在 * 符号左边的时候,用来修饰指针所指向的变量, 即表示指针所指向的变量为常量,不可以被改变。
int b = 500;
const int *a = &b;/*或者 int const *a = &b */
*a = 400;/*这种写法错误,a指向的内存单元的值不可以再被改变*/
这种情况下如果非要改变*a地址可以这样操作
int b = 500;
const int *a = &b;
b = 400;/*这样写是可以的*/
还有一种方法可以改变*a的值,
int b = 500;
int c = 400;
const int *a = &b;
a = &c;/*这种写法是合法的*/
修饰指针本身
上面第三种情况即 int * const b = &a; 表示指针本身被修饰为常量,这种情况下不能对指针本身进行更改操作,但是所指向的内容可以改变。
如:
int b = 500;
int c = 400;
int * const a = &b;
*a = 400;/*这种写法合法,a虽然被const修饰,但是a指向的变量可以被改变*/
a = &c/*这种写法错误,a已经被修饰为常量,不能再对其修改复值*/
同时修饰指针和指针指向的变量
上面第四种情况即 const int * const a = &b; 表示指针a和a指向的变量都不能再被改变,为上面两种情况的结合。
int b = 500;
int c = 400;
const =int * const a = &b;
*a = 400;/*错误,a的变量不能在被改变*/
a = &c; /*错误,指针a不能再赋值*/
sizeof 和 strlen
sizeof顾名思义是求大小,单位是字节,返回类型为int类型或long 类型。
strlen顾名思义是求长度,以 “\0” 为标志,且其参数只能是char * 类型。
int main()
{
int arr[5] = {1,2,3};
char brr[10] = "abcde";
printf("sizeof(arr) = %d\n",sizeof(arr));
printf("sizeof(brr) = %d\n",sizeof(brr));
//printf("strlen(arr) = %d\n",strlen(arr));/*编译器报错,因为strlen参数 只能为char * 类型*/
printf("strlen(brr) = %d\n",strlen(brr));
}
以上输出结果分别为:
sizeof(arr) = 20
sizeof(brr) = 10
strlen(brr) = 5
int *a 和 int a[]区别
int *a 和 int a[]区别就是指针和数组的区别:
1. 指针的本质是一个与地址相关的复合类型,它的值是数据存放的位置(地址);数组的本质则是一系列的变量。
2. 数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是”可变”,所以我们常用指针来操作动态内存。可以理解为数组名为常量,地址为变量
3. 当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
野指针和空指针
“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。野指针的成因主要有两种:
一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
二、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是 delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。
三、野指针和空指针都不能再对其赋值
本文详细解析了C/C++中const关键字的使用方法,包括修饰变量、指针及其指向的内存单元的不同情况,并介绍了sizeof与strlen的区别及int*a与inta[]的区别。
9万+

被折叠的 条评论
为什么被折叠?



