从头开始学C语言第三十一天——void指针和const指针
void指针
void指针是一种不确定数据类型的指针,可以通过强制转换类型让该指针指向任何数据类型的变量。
说明形式:void *<指针名>
对于void指针,在没有强制转换数据类型之前,不能进行指针的算术运算
#include<stdio.h>
int main()
{
int a=10;
void *p;
p = &a;
printf("%d %d \n",a,*(int*)p);
return 0;
}
printf("%d %d\n",a,*(int*)p);
这一行代码中,如果我们直接输出*p,那系统弄会报错,因为此时指针p是void类型,也就是还不确定数据类型的指针,%d要求输出的是十进制的整型数因此会出现类型不匹配的错误,所以需要写成*(int *)p的形式;另外,因为p是指针变量,因此在强制转换数据类型时需要加上*,如果只是写成*(int)p,那么系统一样会报错,原因同样是类型不匹配。
用void指针遍历一维数组
#include<stdio.h>
int main()
{
int a[]={1,2,3,4,5,6};
void *p;
int n,*pa;
n = sizeof(a) / sizeof(int);
p=a;
pa=(int*)p;
for(int i=0;i<n;i++)
{
p=a;
printf("%d ",a[i]);
printf("%d ",*((int*)p+i));
printf("%d ",((int*)p)[i]);
printf("%d ",pa[i]);
}
return 0;
}
const修饰指针
const指针的作用:常量化变量的值,换句话就是固定变量的值。一般在定义一个变量后会给该变量赋值,赋的值可以是任意的,但是加了const作修饰,那么这个变量的值就不能改变。
一般形式:
const <数据类型> 变量名 = [<表达式>];
const int a =10;//a的值就是10,不能修改;
变量有const作修饰,那么想要用指针间接访问时,指针也需要加上const修饰
一般说明形式:
const <数据类型> *<指针变量名> [= <指针运算表达式>];
常量化指针的目标不允许通过指针改变目标数值,但是指针变量存储地址可以修改
<数据类型>* const <指针变量名> [= <指针运算表达式>];
指针变量存储地址不能改变,但是可通过*<指针变量名>改变所指变量的数值
const <数据类型>* const <指针变量名> [= <指针运算表达式>];
常量化指针的目标不允许通过指针改变目标数值,指针变量存储地址也不可以修改
#include<stdio.h>
int main()
{
int a=10,b=5;
const int *p1;
p1=&a;//将a的地址放入p1中
printf("%p\n",p1);
//(*p)++;//所指目标变量数值不可修改
p1++;//但是存储地址可以修改
printf("%p\n",p1);
int *const p2=&a;
//p2=&b;//存放地址不可修改
printf("%d\n",*p2);
(*p2)++;
printf("%d\n",*p2);
const int * const p3=&a;
//(*p3)++;
//p3++;
//存储地址不可修改,目标变量数值也不可修改
return 0;
}