<强>一、指针的大小强>
<强>二、野指针和空指针强>
# include & lt; stdio.h> int主要(空白) { int=6; int * p; p=;//把一个的值赋给指针变量p, p为野指针,这样做不会出现啥问题,但是没什么意义 p=0 x456;//为指针变量p赋值,p为野指针,这样做不会出现啥问题,但是没什么意义 * p=100;//操作野指针指向未知区域,内存会出问题,报的错。 返回0; } >之前但是,野指针和有效指针变量保存的都是数的值,为了标志此指针变量没有指向任何变量(空闲可用),C语言中,可以把NULL赋值给此指针,这样就标志此指针为空指针,没有任何指针。
int * p=零;说明:野指针指向一个未知的空间,程序中允许存在野指针。操作系统将0到255作为系统占用不允许访问操作,操作野指针对应的内存空间可能会报错。
# include & lt; stdio.h> int主要(空白) {//空指针是指内存地址编号为0的空间 int * p=零;//操作空指针对应的空间一定会报的错 * p=6;//这样写会报的错 printf (" % d \ n”* p); 返回0; }<强>三,万能指针void * 强>
void *指针可以指向任意变量的内存空间:
# include & lt; stdio.h> int主要(空白) {//void * p=零; void * p; int=6; p=(void *)和一个;//指向变量时最好转换为void *//使用指针变量指向内存时,转换为int * * ((int *) p)=10;//把一个的值修改为10//在通过万能指针修改变量的值时,需要找到变量对应的指针类型。//printf (" % p \ n, p); printf (“=% d \ n”); 返回0; }程序执行结果:
万能指针可以接收任意类型变量的内存地址。
void * p=,,<强>四,const修饰的指针变量强>
(1) const修饰指针类型
const int * p=,,这种情况:可以修改指针变量的值,不可以修改指针指向的内存空间的值。
# include & lt; stdio.h> int主要(空白) { int=3; int b=6; const int * p=,;//p1的初始值是一个的地址 p=, b;//把b的地址赋给p1,即改变p1的值(这是可行的) * p=15;//报错,提示表达式必须是可修改的左值,因为不可以修改指针指向的内存空间的值(的值)。 printf (" % p \ n, p);//打印出的p1的值是b的地址,即可以修改指针变量的值。 返回0; }(2) const修饰指针变量
int * const p=,,这种情况:可以修改指针指向的内存空间的值,不可以修改指针变量的值。
# include & lt; stdio.h> int主要(空白) { int=3; int b=6; int * const p=,; * p=100; p=, b;//报错,提示:表达式必须是可修改的左值。即不可以修改指针变量的值 printf (" % d \ n”);//打印出的一个的值为100,即可以修改指针指向的内存空间的值 返回0; }(3) const修饰指针变量和指针类型
const int * const p=,,我们知道在这种情况下,既不可以修改指针指向的内存空间的值,也不可以修改指针变量的值。但是我们仍能通过二级指针来修改指针指向的内存空间的值和指针变量的值。
# include & lt; stdio.h> int主要(空白) { int=2; int b=6; const int * const p=,; int * *页=,p; * *页=100;//把100赋值给一个,即通过二级指针可以修改一个的值,const不起作用了 printf (" % d \ n”* p);//打印出的一个的值为100 *页=,b;//把b的地址赋值给p,通过二级指针可以改变p的值,const不起作用了 printf (" % d \ n”* p);//打印出的是b的值,即6 返回0; }C语言中各类指针的用法(小结)