const以及const指针相关问题

来源:互联网 发布:js jc jk jd 编辑:程序博客网 时间:2024/05/29 16:04

今天看到execl()库函数的兄弟函数execle()的相关介绍:

 

int execle(const char *path, const char *arg, ..., chart *const envp[]);

 

一下就被const char *和char *const搞懵了。记得前段时间看C++ Primer时印象还蛮深刻的,现在却又忘了。

 

知识啊,只有不断学习使用,才能转变为永久记忆,就像记住心爱mm一切的一切一样。

 

现在就来总结下与const有关的知识点,不断更新加入,谨为方便我和像我一样的菜鸟们记忆学习。

 

1、常量限定符

 

const限定符将一个对象转换为常量,转换后的对象属性将变为只读,并且要求初始化。在诸多面试中,会让写关于字符串处理的各种函数,其中一考察点,即在参数列表中源字符串需要用const来修饰,保护其在函数生命期间不被改写。

 

例如,在写strcpy()函数原型时,就有此类问题(支付宝笔试时就遇过这个问题,可惜那时我年少无知……),函数原型应该为下。

 

extern char *strcpy(char *dest, const char *src);

 

补:对于该函数,还会有问,既然目标字符串已经通过char *类型得到,为什么其函数返回值还需要为目标字符串的地址。

 

答曰,为了链式操作能够顺利进行,例如这样的操作可以方便完成strlen(strcpy(dest, src));

 

2、const char *与 char *const

 

const char *p;

 

p是一个指向char类型的const对象的指针,在此定义中,p本身不是常量,可以为p进行不同的赋值,但是不能修改p指向的对象。并且,p可以指向一个非const的对象,只不过在赋值后,被指向的对象不能再进行任何修改(同时,一个const对象,只能被p这种类型的指针所指)。

 

char a[] = "HelloWorld";

char *const *q = a;

 

q是指向一个非const对象的const指针,可以将其看作一个指向char类型对象的const指针。换句话说,即q在初始化之后,不能再赋值给其他地址值,但是q指向的值可以发生改变。

 

To be Continued.

原创粉丝点击