笔记:
1.指针与const
const在*左边不是表示数值不能改变,而是表示不能通过指针改变数值,直接赋值是可以改变的。
常量指针:常量不可以变,指针指向可以变(如不能通过指针p去修改变量i )
指针只有2个能力,一是指向,一是通过指针去修改值,2个const一个把指向锁了,一个把修改能力锁了
判断哪个被const了的标志是const在**前面还是后面(在前面:它所指的东西不能被修改;在后面:指针不能被修改)
转换
把一个非const的转换成const的
void f(const int* x);
int a = 15;
f(&a); //OK
const int b = a;
f(&b); //OK
b = a + 1;
当要传递的参数类型比地址大时,以上手段既能用较少字节数传递值给参数,又能避免函数对外面的变凉的修改
const数组
- const int a[] = {1,2,3,4,5,6,};
- 数组变量已经是const的指针了,这里的const表明数组的每个单元都是const int
- 必须通过初始化赋值
保护数组织
把数组传到函数里,又不希望函数修改数组,就可要求函数把函数原型写成: int sum(const int a[],int length);
这样在sum函数里就不会对数组有任何修改
把数组传入函数传入的是地址,则函数内部可修改数组的值
为保护数组不被函数破坏,可设置参数const
3.指针运算
验证:
#include <stdio.h>
int main(void)
{
char ac[] = { 0,1,2,3,4,5,6,7,8,9, };
char* p = ac;
printf("p=%p\n", p);
printf("p+1=%p\n", p + 1);
int ai[] = { 0,1,2,3,4,5,6,7,8,9, };
int* q = ai;
printf("q=%p\n", q);
printf("q+1=%p\n", q + 1);
return 0;
}