关于const字符的c语言程序疑问

C语言 码拜 10年前 (2015-05-11) 854次浏览 0个评论
 

代码段一:

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的函数相比)

5分
第一个 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; 错误
}
2分
const int *a,a是指针变量,*a是常量,不能赋值
2分
const int * a    内容常量
int* const a.    指针常量
3分
constt的使用
http://blog.csdn.net/zhangxiangdavaid/article/details/38082159
8分
第二个改成 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则是可变的。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于const字符的c语言程序疑问
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!