开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天,点击查看活动详情
转换
总是可以把一个非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
所以必须通过初始化进行赋值。
保护数组值
因为把数组传入函数时传递的是地址,所以那个函数内部可以修改数组的值,
为了保护数组不被函数破坏,可以设置参数为const;
int sum(const int a[]);
指针运算
指针加一
给一个指针加一表示要让指针指向下一个变量
int a[10];
int p=a;(此时p代表a[0])
*(p+1)->a[1]
如果指针不是指向一片连续分配的空间,如数组,则这种运算没有意义。
指针加一就是指加一个sizeof(指针的类型)。
当定义一个数组a[],且定义的指针int p=a;那么(p+n)<-->a[n]
指针计算
这些算数运算可以对指针做:
给指针加、减一个整数(+、+=、-、-=)
递增、递减(++/--)
两个指针相减(结果为地址的数值差除sizeof(指针的类型))
*p++
取出p所指的那个数据来,完事之后顺便把p移到下一个位置去;
*的优先级虽然高,但是没有++高;
常用于数组类的连续空间操作;
在某些CPU上,这可以直接被翻译成一条汇编指令。
例:数组的遍历(-1的作用是在第二个等价的代码中作为循环结束的条件)
char ac[]={0,1,2,3,4,5,6,7,8,9,-1};
char *p=&ac[0];
int i;
for(1=0;i<sizeof(ac)/sizeof(ac[0]);i++){
printf("%d\n",ac[i]);
}
可以等价于:
char ac[]={0,1,2,3,4,5,6,7,8,9,-1};
char *p=&ac[0];
int i;
while(*p!=-1){
printf("%d\n",*p++);
}