指针及指针与数组及const修饰指针
什么是指针?
指针是一个值为地址的变量,形如int* p=&a;
通过这个简单的例子我们可以清楚指针的四个部分:指针的类型int *
、指针所指向数据的类型int
、指针的值&a
即a的地址、指针本身所占据的内存区。
而机器中地址的长度是固定的,所以指针的长度是确定的,也就是说,int *
、char *
、double *
类型的指针都是相同长度的内存大小,用函数sizeof(p)
测一下,64位下指针占据8
个字节的长度。
使用指针
这里只谈谈最基础的指针初始化、赋值与解引用问题。
在上面那个例子中,我们在声明指针的时候一起初始化了,那是不是声明了指针就一定要初始化?当然不是,定义一个指针可以不用初始化,但是在解引用指针时一定要确定它是否被初始化即是否指向了某一个确定的可访问的内存位置。
//错误原因,p未初始化,指向一个非法地址
int* p;//int* p=&a;
*p=200;
初始化为空指针NULL
指向内存编号为0的空间,操作该内存空间会报错,一般情况NULL指针用于程序条件判断。
int* p=NULL;
...
if(p != NULL){
free();
}
万能指针
使用void *
当操作内存空间时需要转换成对应类型,告知需要操作的内存大小。
int a=10;
void* p=&a;
*(int *)p=100;
printf("%d\n",*(int *)p);
const 修饰指针
1、通过指针修改const修饰的常量
//这种方式不安全,可以通过指针修改
const int a=10;
int* p=&a;
*p=100;//修改后a和*p都变为100
2、指针常量和常量指针
常量指针–“the pointer to const”即指向常量的指针。const 在 * 之前
const int * p or int const * p
常量指针本质上是一个指针,常量表示指针指向的内容,说明该指针指向一个“常量”。在常量指针中,指针指向的内容是不可改变的,指针看起来好像指向了一个常量。
int a=10,b=100;
const int *p=&a;
p&#