您的位置:首页 > 编程语言 > C语言/C++

C语言之const与指针

2017-05-14 21:29 204 查看
const大家一定都不陌生,是一个用来修饰变量的类型,在C语言中const和指针的考点一直是面试题的热门,乘此机会,我来趴一趴这个神奇的家伙

const char*str1;
char*str2;


const 和非 const 类型转换

因为通过 str1 不能修改数据,而赋值后通过 str2 能够修改数据了,意义发生了转变,所以编译器不提倡这种行为,会给出错误或警告。

也就是说,const char 和char 是不同的类型,不能将const char 类型的数据赋值给char 类型的变量。但反过来是可以的,编译器允许将char 类型的数据赋值给const char 类型的变量。

这种限制很容易理解,char 指向的数据有读取和写入权限,而const char 指向的数据只有读取权限,降低数据的权限不会带来任何问题,但提升数据的权限就有可能发生危险。

C语言标准库中很多函数的参数都被 const 限制了,但我们在以前的编码过程中并没有注意这个问题,经常将非 const 类型的数据传递给 const 类型的形参,这样做从未引发任何副作用,原因就是上面讲到的,将 非const 类型转换为 const 类型是允许的。

下面是一个将 const 类型赋值给非 const 类型的例子:

#include <stdio.h>

void func(char *str){
printf("%s",str); }

int main(){
const char *str1 = "friend";
char *str2 = str1;
func(str2);
return 0;
}




出错原因是如果成功,那么意味着可以通过str2修改str1,这就麻烦了,所以编译失败。

将非const赋值给const型

#include <stdio.h>
void func(char *str)
{
printf("%s",str);
}

int main(){
const char *str1;
char *str2= "friend";
str1=str2;
func(str2);
return 0;
}




通过原因:因为不可能通过const去修改str2,同时假设可以的话对于str2也是没任何毛病,所以就通过编译了。

总结:这个知识点一直是面试的热门问题,万一笔试有呢,万一有呢,所以还是要做好总结,不过我现在有个小小的问题

问题

假设
int *a,*b;


*a=10,*b=20;


a=b;
那么*a就是20了,是a指向了b的地址,所以a的内容改变了。这个时候若*b=200,那么*a也是200了,但是改变*a的值,*b是不会变的

b=a;
那么*b就是10了,是因为b指向了a,那么改变*a=100,*b也会改变为100吧,但是改变*b的值那么*a也会纹丝不动的。

好吧,没问题了 (这里有重大问题,待/_ \哥好好看完c指针再来完善下)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: