void指针和const

1>void 指针是一种不确定数据类型的指针变量,它可以通过强制类型转化让该变量指向任何数据类型的变量。
2>对于void指针,在没有强制类型转换之前,不能进行任何指针的算术运算。(例如给一void指针++,上一次void指针地址与加一后的地址没有任何规律。)
错误代码:(目标是遍历一个一维数组)
int m[]={5,8,6,45,6} ;
void *p;
p=m;
int i;
int n=sizeof(m)/sizeof(int);

for(i=0;i<n;i++){
printf("%2d “, * (int * )(p+i));
}
以上为错误代码运行结果
纠错原因:这个错误很幼稚,强制转化的应该是p指针,而我写的时候强制转化的是(p+i)
应该把 * (int * )(p+i)改成 * (int * )p+i);
修改后正确运行代码
注意:void指针在使用的时候必须强制转化,在赋值的时候可以省略不写,只是存储一个值,可以存上即可,不会有较大问题。
const变量
1>常量化变量是为了使得变量的值不能修改。
2>变量有const修饰时,若想用指针间接访问变量,指针也要有const修饰。
情况一:const放在 * 前;
代码:
int m[]={2,3,5};
int i;
int n=3;
const int * p;
p=m;
for(i=0;i<n;i++){
printf(”%d\n",++ *(p+i));
}
以上代码输出 * (p+i),正确,如果输出是++ * (p+i)则错误。说明:const放在 *p之前,意味着 *p不能修改。不能通过指针改目标。
情况二:const放在 * 后边;
错误代码:
int n=9;
int * const q;
q=&n;
printf("%d",*q);
把const放在 * 后边,不能直接通过指针变量去地址。
修改后代码:
int n=9;
int * const q=&n;
printf("%d",*q);
这样可以实现取出变量n中的数据。说明:const修饰q,q不可以改动,只能依据初始设定。但是++ *q可以改变。
情况三:const既放在指针前边,也放在指针后边。
这种情况既不可以修改指针变量的地址,也不可以通过 *<指针变量名称>修改指针所指向变量的值。

const修饰谁谁不能变。

猜你喜欢

转载自blog.csdn.net/qq_36942291/article/details/86595269