当前位置: 代码迷 >> C语言 >> [原创]对const使用的理解.
  详细解决方案

[原创]对const使用的理解.

热度:295   发布时间:2007-11-16 23:43:35.0
[原创]对const使用的理解.

*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 http://www.bc-cn.net
*/ 作者: neverTheSame E-mail:zhaoxufeng9997@126.com QQ:475818502
*/ 时间: 2007-11-16 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------


const对很多人来说既陌生又熟悉.可以说很棘手的问题,
有些地方很难理解.我在刚学C的时侯,对它的理解也是很模糊的.
好像有点理解,但又说不出个所以然来.
在此,就向大家分享,我一直以来对它的理解,如有不当之处请指教.

const可以说一种常量的声明的关键字,如const int a=2;变量a就是一个常变量,
a的值不能被改变,这个改变是一定意义上的不能改变.而是说值的改变不能直接通过a这个符号
来改变.但事实上,a的值是可能改变的.如下例子:
#include<stdio.h>
int main()
{
const int a=3;
int *p=(int*)&a;
*p=100;
printf("%d",a);
return 0;
}
这样a的值就被改变了.
const也可以说一种只读的关键字,如int integerArray[10]={0};const int* pointer=integerArray;
这里pointer是指向一个常变量的指针变量.pointer指向可能改变,但它所指向的变量的值就不能直接通过pointer来改变.
如:*(p+1)=2;这是不可以的.但如果有另外一个数组integerArray1,p=integerArray1是可以有.
还有指向的变量不可改变,这种不可改变是一定意义的改变.
如下例子:
#include<stdio.h>
int main()
{
int array[10]={0};
const int *pointer=array;
int *pointer1=(int*)pointer;
pointer1[0]=1;
printf("%d",array[0]);
return 0;
}
以上例子说明了,不能直接通过pointer改变array,但可能间接通过pointer来改变array;
现在说一说有const声明常指针,它的声明不像声明指向常量的指针形式.
它的声明形式为:int* const pointer; .常指针在编程的过程中它的指向不能改变.
因此,常指针在声明的时侯一定要给它赋初值.否则,就不能直接给它赋值.
但是,如果一定要给它赋上一定的值,是可以的.如下例子:
#include<stdio.h>
int main()
{
int a=2;
int* const p;
int **p1=(int**)&p;
*p1=&a;
printf("%d",*p);
return 0;
}
经过上面的介绍,相信大家对指向常量的常指针的声明也不难写出吧.它的声明形式:
cont int* const p;它就不用作过多的介绍了,指向常量的常指针就是指向常量的指针与
常指针的复合了.
好了就说到这里吧.

搜索更多相关的解决方案: const  

----------------解决方案--------------------------------------------------------

const 声明的常量当然可以变。因为是存储在内存中的,可以使用地址访问

#define N 100 // 相当于立即数


const 只是一种方法 // 给编译器看的

防止你在编程时不小心改变了你不想改变的变量。




搂主写的真长

[此贴子已经被作者于2007-11-17 0:38:49编辑过]


----------------解决方案--------------------------------------------------------
帮你顶一下吧,回去再看看,现在在外面
----------------解决方案--------------------------------------------------------
define 是预编译的,和const 有点不一样
MSVC6.0 语法限制过严

void inverse(int n,const short stage,short r)
{
char temp[stage];
int i=0;
do {
temp[i] = n%r; // 取 r 进制数个数位上的值
i++; n /= r;
}while(i<stage);//while(n>0);

return 0;
}
上面的不对
但是
#define stage 3
void inverse(int n,short r)
{
char temp[stage];
int i=0;
do {
temp[i] = n%r; // 取 r 进制数个数位上的值
i++; n /= r;
}while(i<stage);//while(n>0);

return 0;
}
这样就OK 了

----------------解决方案--------------------------------------------------------

变量似乎不可以用来作数组的大小的声明吧.


----------------解决方案--------------------------------------------------------
以下是引用neverTheSame在2007-11-18 10:26:26的发言:

变量似乎不可以用来作数组的大小的声明吧.

4楼说的是用宏定义,那不是变量非变量的问题,你可能没看仔细


----------------解决方案--------------------------------------------------------

//---------------------------------------------------------------------------//
// const 不是为了声明简单的数字常量而出现的 //
//------------------------------------------//


struct st {
char arr[10];
int num;
};

struct st const a = {"const", 1}; // #define 无法办到的

//

写错n次

[此贴子已经被作者于2007-11-18 12:36:28编辑过]


----------------解决方案--------------------------------------------------------

但事实上,a的值是可能改变的.如下例子:
#include<stdio.h>
int main()
{
const int a=3;
int *p=(int*)&a;
*p=100;
printf("%d",a);
return 0;
}
这样a的值就被改变了

请问楼主你运行试过了没有?没果没有,请你运行一下
特别是gcc编译器,你更要试试



by 雨中飞燕 C/C++学习讨论群:46520219
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge)论坛:[/url] http://yzfy.org/bbs/
Blog: http://yzfy.org/blog/blog.php?uid=2

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url] [url=http://blog.programfan.com/article.asp?id=24801]请不要写出非int声明的main函数[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=181314]C++编写的Windows界面游戏[/url]


----------------解决方案--------------------------------------------------------
以下是引用neverTheSame在2007-11-18 10:26:26的发言:

变量似乎不可以用来作数组的大小的声明吧.

const 声明的变量当作常量,
const int a = 3;
a = 4; // 这是不允许的。


//------------------------------------------------
关于变量:

int n = 11;
char name[n]; // C99 标准支持这个

也没什么好奇怪的:
函数等都是在调用函数是才分配空间的,所以 char name[n] 也不是不可以的,
不过分配好空间后 name 数组只能是 11 个元素,不能再增加了,也不会减少。

//


----------------解决方案--------------------------------------------------------

刚刚相想通

20 楼

[此贴子已经被作者于2007-11-19 15:19:26编辑过]


----------------解决方案--------------------------------------------------------
  相关解决方案