C语言基础知识学习记录

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语言基础知识学习记录_第1张图片

你可能感兴趣的:(C语言杂谈)