C语言程序设计(21)

77 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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++);

}