关于const字符的c语言程序疑点
关于const字符的c语言程序疑问
代码段一:
代码段二:
代码段三:
为啥代码段一能够通过运行,代码段二不可以?
代码段3不能通过是可以理解的。
另:const这个关键词其实是编译器需要使用的对不对?编译器用来判断函数内部有没有违反const的约束。
产生的汇编代码中,并没有什么不同(与不加const的函数相比)
------解决思路----------------------
第一个 const int *a是说*a为常量,不能给*a赋值,但可给a赋值,例如:*a=4;error a=&c;right
int * const a;则是a不可赋值,*a可以
例如
1.#include<stdio.h>
main()
{
const int *a ;
int c=3;
a=&c;无警告//*a=4;错误
}
2.
#include<stdio.h>
main()
{
int b=4,c=3;
int *const a=&c ;//要初始化,不然会出现野指针
*a=4;//正确a=&b; 错误
}
------解决思路----------------------
const int *a,a是指针变量,*a是常量,不能赋值
------解决思路----------------------
const int * a 内容常量
int* const a. 指针常量
------解决思路----------------------
constt的使用
http://blog.****.net/zhangxiangdavaid/article/details/38082159
------解决思路----------------------
第二个改成 int* const a.
原理:
const & 指针
类型声明中const用来修饰一个常量,有如下两种写法,那么,请问,下面分别用const限定不可变的内容是什么?
1)、const在前面
const int nValue; //nValue是const
const char *pContent; //*pContent是const, pContent可变
const (char *) pContent;//pContent是const,*pContent可变
char* const pContent; //pContent是const,*pContent可变
const char* const pContent; //pContent和*pContent都是const
2)、const在后面,与上面的声明对等
int const nValue; // nValue是const
char const * pContent;// *pContent是const, pContent可变
(char *) const pContent;//pContent是const,*pContent可变
char* const pContent;// pContent是const,*pContent可变
char const* const pContent;// pContent和*pContent都是const
答案与分析:
const和指针一起使用是C语言中一个很常见的困惑之处,在实际开发中,特别是在看别人代码的时候,常常会因为这样而不好判断作者的意图,下面讲一下我的判断原则:
当const所在代码段中不包含括号时,沿着*号划一条线,如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。你可以根据这个规则来看上面声明的实际意义,相信定会一目了然。
另外,需要注意:对于const (char *) ; 因为char *是一个整体,相当于一个类型(如 char),因此,这时限定指针是const。
一个简单的判断方法:指针运算符*,是从右到左,那么如:char const * pContent,可以理解为char const (* pContent),即* pContent为const,而pContent则是可变的。
代码段一:
void testconst(const int *a){
a=0;
}
代码段二:
void testconst(const int *a){
*a=0;
}
代码段三:
void testconst(const int a){
a=0;
}
为啥代码段一能够通过运行,代码段二不可以?
代码段3不能通过是可以理解的。
另:const这个关键词其实是编译器需要使用的对不对?编译器用来判断函数内部有没有违反const的约束。
产生的汇编代码中,并没有什么不同(与不加const的函数相比)
------解决思路----------------------
第一个 const int *a是说*a为常量,不能给*a赋值,但可给a赋值,例如:*a=4;error a=&c;right
int * const a;则是a不可赋值,*a可以
例如
1.#include<stdio.h>
main()
{
const int *a ;
int c=3;
a=&c;无警告//*a=4;错误
}
2.
#include<stdio.h>
main()
{
int b=4,c=3;
int *const a=&c ;//要初始化,不然会出现野指针
*a=4;//正确a=&b; 错误
}
------解决思路----------------------
const int *a,a是指针变量,*a是常量,不能赋值
------解决思路----------------------
const int * a 内容常量
int* const a. 指针常量
------解决思路----------------------
constt的使用
http://blog.****.net/zhangxiangdavaid/article/details/38082159
------解决思路----------------------
第二个改成 int* const a.
原理:
const & 指针
类型声明中const用来修饰一个常量,有如下两种写法,那么,请问,下面分别用const限定不可变的内容是什么?
1)、const在前面
const int nValue; //nValue是const
const char *pContent; //*pContent是const, pContent可变
const (char *) pContent;//pContent是const,*pContent可变
char* const pContent; //pContent是const,*pContent可变
const char* const pContent; //pContent和*pContent都是const
2)、const在后面,与上面的声明对等
int const nValue; // nValue是const
char const * pContent;// *pContent是const, pContent可变
(char *) const pContent;//pContent是const,*pContent可变
char* const pContent;// pContent是const,*pContent可变
char const* const pContent;// pContent和*pContent都是const
答案与分析:
const和指针一起使用是C语言中一个很常见的困惑之处,在实际开发中,特别是在看别人代码的时候,常常会因为这样而不好判断作者的意图,下面讲一下我的判断原则:
当const所在代码段中不包含括号时,沿着*号划一条线,如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。你可以根据这个规则来看上面声明的实际意义,相信定会一目了然。
另外,需要注意:对于const (char *) ; 因为char *是一个整体,相当于一个类型(如 char),因此,这时限定指针是const。
一个简单的判断方法:指针运算符*,是从右到左,那么如:char const * pContent,可以理解为char const (* pContent),即* pContent为const,而pContent则是可变的。