关于用越界数组修改const char 数组值的问题

数组变量是const的指针怎么理解呢?
但我们不是依然可以在初始化之后改变数组单元的值吗,就像a[0]=10,但const不是不允许改变吗?这个数组变量是const的指针怎么理解呢?求详细一点啊,万分感谢!怎么利用这个解释 int b[]= 是错误的呢?
首先先对比一下int * const arr 和 int const * arr的区别吧。前者的const作用在arr上,arr的值不可以变,比如arr++就是错误的。后者作用在* arr上,即不能通过arr去改变它所指向的地址里存储的值,即*arr = 10是错误的。这就解释了第一个问题。
其次,int a[]的方式声明了一个本地变量,一经声明便分配了一段固定的连续的内存单元。a是这段存储单元的首地址,如同上边说的一样a是一个常量。int b[],b也是一个常量。常量 = 常量?这显然是错的。这就解释了第二个问题。
至于为什么把数组名设计为一个常量,希望有大神可以解惑^_^
你还没有登录,请先登录或注册慕课网帐号
1.首先一个数组,比如a[10] ,它的首地址a和指针不一样,你不能再对a赋值,比如你写的int b[10]; b=a;是错误的,2.其次const修饰数组,比如const int a[10]= {1}; 说明里面的数据是常量,你再写a[0] = 1之类出错。3. 还有const int a[10] = {1}中的a[0] = 1没问题,但是a[0] 和const int b = 1 的b也有区别,比如:
const int a[10] = {1}; int arr[ a[0] ] = {0}; 会出错
const int b=1;
int arr[b] = {1} = {0};
至于为什么,还不知道,希望大神解答。
你还没有登录,请先登录或注册慕课网帐号
数组名绝对不等于指针,而且不是指针。  数组名是指针常量,地址是绝对的,score指向受保护,但首地址的内容可以改变,所以数组首地址应该是指针常量int *const score。  指针是一个变量,变量的值是另外一个变量的地址。那么,既然指针是变量,那么指针必然有自己的存储空间,只不过是该存储空间内的值是一个地址值,而不是别的内容。摘自百度知道。
你还没有登录,请先登录或注册慕课网帐号
数组变量是一个指针,它指向的内容是const int 类型。数组变量本身不用初始化它可以指向任何标示符,但它指向的内容是不能被改变的
你还没有登录,请先登录或注册慕课网帐号
数组指针是地址,你所谓的改变是赋值不改变地址。
你还没有登录,请先登录或注册慕课网帐号
24563人关注
Copyright (C) 2018 imooc.com All Rights Reserved | 京ICP备 号-11posts - 63,&
comments - 13,&
trackbacks - 0
1 #include&stdio.h&
2 #include&string.h&
4 int main()
char a[5] = "abcd";
//常指针a指向字符串常量"abcd"的首地址,a不能被改变(不可作为左值被重新赋值)
char *f = "abcd";
//f指向"abcd",上面a和这个f除了a是常指针之外没有区别,f可以作为左值
const char b[10] = "safajshjf";
//常指针b指向"safajshjf"的首地址,且b指针不可更改,且数组内容不可更改
const char *c = "asdfdsgd";
//c指向"asdfdsgd"的首地址,且该内存段内容不可更改
char *const d = "safdsfgsdg";
//常指针d指向"safdsfgsdg"的首地址,且d本身不可更改
const char* const e = "adsgfsdg";
//常指针e指向"adsgfsdg"首地址,且e本身不可更改,且该内存段内容也不可更改
//上面c和d,e不同,c不是const的,c指向的内存区是const的,故c可以被重新赋值
c = "fasdffds";
//c被重新赋值为"fasdffds"的首地址
/*下面的三行都不行,因为数组名除了初始化时,再也不能作为左值了.而const类型的d和e也不能再作为左值.
a = "afds";
b = "asfdsfdgg";
d = "fasdgsdg";
e = "fasdfgg";
//下面的可以,a和d指向的内存段内容都可以更改
strcpy(a,"sdfs");
strcpy(d,"sfsdgd");
/*下面的不通过,b,c,d指向的内容都不可更改
strcpy(b,"sfsdgf");
strcpy(c,"sfsgddg");
strcpy(e,"safsgdg");
//下面把常指针赋值给非const指针,可以
/*以下赋值非法,编译出错.因b,c,e指向的内存区内容不可更改,如果进行下面的赋值,编译器不能保证别的地方不去使用f而改变内存区的内容
//下面的五个都是可以的,因为const和非const的变量都可以赋值给const类型的变量
const char *g =
const指针的用法如上例所示,分别是限制指针和指针内存区域的,有这些限制,也仅是针对当前变量的限制,如果原本的内存地址已知,后来赋值给了const*类型的指针,那么利用原来的内存地址依然是可以修改该内存区域的.
数组名相当于*const类型的,因为数组名和*const在以后都不能再给数组名或指针赋值,而只能修改数组的内存区或指针指向的内存区.const* typename const类型的是指针和内存区都不可以修改的.
特别注意上面的数组名a,这是个常指针.无论是整形数组还是字符数组,初始化的时候都是赋值初始化的,不要把字符数组的初始化理解成把一个常量字符串的指针赋值给了字符数组名.
看看下面的反汇编
char a[5] = "abcd";
eax,dword ptr [___xi_z+2Ch (4020E4h)]
dword ptr [ebp-0Ch],eax
cl,byte ptr [___xi_z+30h (4020E8h)]
byte ptr [ebp-8],cl
const char b[8] = "safader";
edx,dword ptr [___xi_z+34h (4020ECh)]
dword ptr [ebp-1Ch],edx
eax,dword ptr [___xi_z+38h (4020F0h)]
dword ptr [ebp-18h],eax
const char *c = "asdfdsgd";
dword ptr [ebp-24h],offset ___xi_z+3Ch (4020F4h)
char *const d = "safdsfgsdg";
dword ptr [ebp-20h],offset ___xi_z+48h (402100h)
const char* const e = "adsgfsdg";
dword ptr [ebp-28h],offset ___xi_z+54h (40210Ch)
可以看出来,这是上面的程序的前五行的代码的反汇编,前两行的是赋值,汇编代码可以看出来,先把静态区中的常量字符串赋值给了eax,然后后eax转给字符数组的内存区,但是后面的三个则是直接把静态区的常量字符串的地址赋值给了指针,如果只赋值给const*指针还好,但是连*const指针也是直接赋值,结果导致了后面的strcpy(d,"sfd")的静态区内存访问错误
阅读(...) 评论()博客访问: 284882
博文数量: 56
博客积分: 610
博客等级: 上士
技术积分: 731
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++ 19:50:33
QString, QByteArray, 和
QVariant这三个类和容器有许多相同之处,并且在一些情况下可以被当作特殊的容器。 同样,像容器,这些类使用隐式共享来优化内存和速度。
我们将从QString开始。 字符串被每个GUI程序所使用,不仅是用户界面而且还有数据结构。 C++原生提供两种字符串: 传统的C风格以'\0'结尾的字符数组和std::string类。 与这些不同,QString使用16-bit
Unicode值。 Unicode 包含 ASCII 和 Latin-1 这个子集和它们的普通数值。 而QString是16-bit,所以它可以表示世界上绝大多数语言的字符。 Unicode的更多信息,请看十七章。
当使用QString时,我们不必操心如此隐秘的细节像分配足够的内存或着是数据是'\0'结尾的。 总的来说,QString可以被认为是一个QChar向量。一个QString能嵌入'\0'字符。
length()函数返回整个字符串大小,包括嵌入的'\0'。
QString提供一个二元+操作符来连接两个字符串和一个+=操作符来向一个字符串追加字符串。 因为QString在字符串的结尾处自动预分配内存,所以通过反复追加字符来增加一个字符串是非常快的。
这是一个+和+=结合的例子:
QString str = "User: ";
str += userName + "\n";
还有一个QString::append()函数与+=操作符有这一样的功能:
str = "User: ";
str.append(userName);
str.append("\n");
组合字符串的一个完全不同的方式是使用QString的sprintf()函数:
str.sprintf("%s %.1f%%", "perfect competition", 100.0);
支持同样的格式说明符像C++库的sprintf()函数。 在上面的例子中,str被赋值为 "perfect competition 100.0%"。
从另外一个字符串或数字来构建字符串还有另外一种方式,就是使用arg():
str = QString("%1 %2 (%3s-%4s)")
.arg("permissive").arg("society").arg(1950).arg(1970);
在这个例子中,"%1"被"permissive"替换,"%2被"society"替换,"%3"被"1950"替换,而"%4"被
"1970"替换。 结果是"permissive society (s)"。 arg()重载支持各种各样的数据类型。 某些重载有附加参数来控制域宽,数字基数,或浮点精度。 通常,arg()是比sprintf()更好的解决方案,因为它是类型安全(type-safe)的,完全支持Unicode,并且允许translators对"%n"参数重新排序。
QString能将数字转换为字符串,通过使用静态函数QString::number():
str = QString::number(59.6);
或者使用setNum()函数:
str.setNum(59.6);
逆向变换,就是将一个字符串转换为一个数字,使用的是toInt(),
toLongLong(), toDouble(),等等。 例如:
double d = str.toDouble(&ok);
这些函数接受一个可选的bool类型的指针并设置这个bool变量为TRue或false,这取决于转换成功与否。 如果转换失败,这些函数返回0。
一旦我们有一个字符串,我们经常想要提取它的一些部分。 mid()函数返回一个给定起始位置(第一个参数)和长度(第二个参数)的字串。 例如,下面的代码在控制台上打印"pays":[*]
[*]使用实用的qDebug() << arg语法需要包含头文件,而qDebug("...", arg)语法在任何至少包含一个Qt头文件的文件中可用。
QString str = "polluter pays principle";
qDebug() << str.mid(9, 4);
如果省略第二个参数,mid()返回从指定的起始位置到这个字符串结尾的子串。 例如,下面的代码在控制台上打印"pays principle":
QString str = "polluter pays principle";
qDebug() << str.mid(9);
还有left()和right()函数,它们也执行类似的工作。 他们俩都接受一个表示字符数量的数字,n,并返回并返回最前面或最后面的n个字符。 例如,下面的代码在控制台上打印"polluter principle":
QString str = "polluter pays principle";
qDebug() << str.left(8) << " " << str.right(9);
如果我们希望找出一个字符串是否包含某个字符,字串,或正则表达式,我们可以使用QString的indexOf()函数中的一个:
QString str = "the middle bit";
int i = str.indexOf("middle");
i将被置为4。indexOf()函数返回-1在失败时,并接受一个可选的起始位置和大小写敏感标志。
如果我们希望检查一个字符串是否是以某物开始或结束,我们可以使用startsWith()和endsWith()函数:
if (url.startsWith("http:") && url.endsWith(".png"))
这个要比下面的简单快速:
if (url.left(5) == "http:" && url.right(4) == ".png")
使用==操作符的字符串比较是大小写敏感的。 如果我们正在比较用户级(user-visible)字符串,localeAwareCompare()经常是正确的选择,并且如果我们希望大小写不敏感,我们可以用toUpper()或toLower()。
if (fileName.toLower() == "readme.txt")
如果我们希望用一个字符串替换另一个字符串的某一部分,可以用replace():
QString str = "a cloudy day";
str.replace(2, 6, "sunny");
结果是"a sunny day"。 可以改用remove()和insert():
str.remove(2, 6);
str.insert(2, "sunny");
首先,我们删除从位置2开始的6个字符,产生一个字符串"a day"(有两个空格),然后我们在位置2处插入"sunny"。
有重载版本的replace(),它们能将所有出现第一个参数的地方用第二个参数替换。 例如,这是如何将所有出现"&"的地方用"&"来替换:
str.replace("&", "&");
一个经常的需求是过滤掉字符串中的空白符(如空格,制表符,和换行符)。 QString有一个函数能从字符串的两端删除空白符:
QString str = "
qDebug() << str.trimmed();
字符串str可被描述为:
trimmed()返回的字符串是:
当处理用户输入时,我们经常希望将一个或多个内部空白符替换为单个空格,另外还要过滤掉两端的空白符。 这就是simplified()函数所做的:
QString str = " BOB \t THE \nDOG \n";
qDebug() << str.simplified();
simplified()返回的字符串是:
一个字符串能被分成为一个装有子串的QStringList,通过使用QString::split():
QString str = "polluter pays principle";
QStringList words = str.split(" ");
在上面的例子,我们把"polluter pays principle"分成三个子串: "polluter", "pays", 和 "principle"。
split()函数有一个可选的第三个参数(译者注:Qt4.4版应该是第二个参数)用来决定保留(缺省)还是丢弃空的子串。
QStringList能被组成单个的字符串,通过使用join()。
join()的参数被插入到每对被组合的字符串之间。 例如,下面展示的是如何创建单个的字符串,它由QStringList中的字符串组成,字符串之间按字母顺序排序并用换行符分开:
words.sort();
str = words.join("\n");
当处理字符串时,我们经常需要判断一个字符串是否是空。 调用isEmpty()或检查length()是否为0就可以达到目的。
在大多数情况下,从const char *字符串到QString的转换是自动的,例如:
str += " (1870)";
这里我们将一个const char *加到一个QString上,没有任何约束。 要将一个const char *显示转换成一个QString,就简单地使用一个QString
cast,或者调用fromAscii()或fromLatin1()。 (See Chapter 17 for an explanation of handling literal strings in other encodings.)
要将一个QString转换为一个const
char *,就使用toAscii()或toLatin1()。 这些函数返回一个QByteArray,它能被转换为一个const char *,通过使用QByteArray::data()或QByteArray::constData()。
printf("User: %s\n", str.toAscii().data());
为了方便,Qt提供qPrintable()宏,它执行和toAscii().constData()顺序相同的操作。
printf("User: %s\n", qPrintable(str));
当我们在一个QByteArray上调用data()或constData(),返回的字符串属于QByteArray对象所有。 这意味着我们不用担心内存泄漏;Qt将会为我们回收内存。
另一方面,我们小心不能使用这个指针太长时间。如果QByteArray没有保存在一个变量中,在语句结束时,它将会被自动删除。
QByteArray有着与QString相似的API。 像left(),
right(), mid(),
toLower(), toUpper(),
TRimmed(), 和 simplified() 在QByteArray中和QString中相应的函数有着同样的语义。
QByteArray对存储纯二进制数据(raw binary data)和8-bit编码文本字符串有用。 一般地,我们推荐使用QString来存储文本而不是用QByteArray,因为QString支持Unicode。
为了方便,QByteArray自动确保the "one past the last"byte总是 '\0',使得传递一个QByteArray给一个带有const char *类型参数的函数时操作变得简单。
QByteArray还支持内嵌的'\0'字符,这允许我们用它来存储任意二进制数据(arbitrary binary data)。
在有些情况下,我们需要用共一个变量存储不同类型的数据。 一种处理是将数据编码成一个QByteArray或一个QString。 例如,一个字符串可以保存一个文本值或一个数字值以字符串形式。 这些处理是灵活的,却抹杀了C++的好处,尤其是类型安全和效率。 Qt提供一个更洁净的方式来处理支持不同类型的变量。
QVariant。
QVariant类支持许多Qt类型的值,包括 QBrush,
QColor, QCursor,
QDateTime, QFont,
QKeySequence, QPalette,
QPen, QPixmap,
QPoint, QRect,
QRegion, QSize, 和QString, 和 基本的C++数值类型,像
double 和 int。
QVariant类还支持容器: QMap,
QStringList, 和QList。
可变类型(Variants )被条目视图类(item view classes),数据库模块,和QSettings所广泛使用,它允许我们读写条目数据,数据库数据,和用户参数等任何兼容于QVariant的类型。 我们已经看过第三章中这样的例子,我们传递了一个QRect,一个QStringList,和一对bool作为可变类型给QSettings::setValue(),并作为可变类型对它们解引用。
创建任意复杂的数据结构是可能的,通过用QVariant套用容器的值类型:
QMap pearM
pearMap["Standard"] = 1.95;
pearMap["Organic"] = 2.25;
QMap fruitM
fruitMap["Orange"] = 2.10;
fruitMap["Pineapple"] = 3.85;
fruitMap["Pear"] = pearM
我们已经创建了一个map,它的键是字符串(产品名),它的值是浮点数(价格)或maps。
顶级map包含三个键: "Orange", "Pear", 和"Pineapple"。 与"Pear"键相关联的值是一个map,它包含两个键("Standard" 和"Organic")。 当在持有可变类型值的容器上迭代时,我们需要用type()来检查可变类型所持有的类型以便我们做出适当的响应。
像这样创建数据结构是很吸引人的,因为我们可以用我们喜欢的方式组织数据。 然而QVariant的方便导致了性能和可读性的损耗。 一般地,只要有可能,用它定义一个适当的C++类来存储我们的数据是值得的。
QVariant被Qt的元对象系统所使用并且因此是QtCore模块的一部分。 不过,当我们连接上QtGui模块,QVariant能存储GUI-related类型,如QColor,
QFont, QIcon,
QImage, 和QPixmap:
QIcon icon("open.png");
QVariant variant =
为了从QVariant将GUI-related类型值解引用,我们可以使用QVariant::value()模板函数像下面这样:
QIcon icon = variant.value();
value()还用于non-GUI数据类型和QVariant之间的转换,但实践中我们一般为non-GUI类型使用to...()转换函数(例如,toString())。
QVariant还可以被用来保存自定义数据类型,假如它们提供一个缺省构造函数和一个拷贝构造函数。 为了这个能工作,我们必须首先使用Q_DECLARE_METATYPE()宏注册类型,放在头文件中类定义的下方:
Q_DECLARE_METATYPE(BusinessCard)
这使我们像这样写代码:
BusinessCard businessC
QVariant variant = QVariant::fromValue(businessCard);
if (variant.canConvert()) {
BusinessCard card = variant.value();
因为编译器的限制,这些模板函数在MSVC
6中不可用。如果你需要使用这个编译器,用全局函数qVariantFromValue(),
qVariantValue(), 和qVariantCanConvert()来代替。
如果自定义数据类型有<<和>>操作符为了写读一个QDataStream,我们可以用qRegisterMetaTypeStreamOperators()注册它们。
此外,这使得通过QSettings来存储自定义数据类型的参数成为可能。 例如:
qRegisterMetaTypeStreamOperators("BusinessCard");
这章的重点是Qt容器,以及QString, QByteArray, 和QVariant。 除了这些类,Qt还提供一些其他的容器。 一个是QPair,它简单地存储两个值,类似于std::pair。 另一个是QBitArray,我们将在第十九章第一节使用它。 最后是QVarLengthArray,QVector的一个底层替代品(low-level alternative)。
因为它在栈上预分配内存并且不是隐式共享,所以它的开销要比QVector小,这使得它适合高效的循环(tight loops)。
Qt的算法,包括一些没有在这里提到的像qCopyBackward()和qEqual(),在Qt的文档里有描述。 Qt容器的更多信息,包括它们的时间复杂度和增长策略,参见。
阅读(56804) | 评论(0) | 转发(6) |
给主人留下些什么吧!~~
请登录后评论。关于类中const
数组成员初始化的问题
[问题点数:20分,结帖人xxj2012xxj]
关于类中const
数组成员初始化的问题
[问题点数:20分,结帖人xxj2012xxj]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2012年7月 C/C++大版内专家分月排行榜第二2012年6月 C/C++大版内专家分月排行榜第二
2012年8月 C/C++大版内专家分月排行榜第三2012年7月 C/C++大版内专家分月排行榜第三
2012年8月 C/C++大版内专家分月排行榜第三2012年7月 C/C++大版内专家分月排行榜第三
2012年8月 C/C++大版内专家分月排行榜第三2012年7月 C/C++大版内专家分月排行榜第三
匿名用户不能发表回复!|在C语言中用const定义的变量如何修改_百度知道
在C语言中用const定义的变量如何修改
我有更好的答案
关于C的关键字——const的理解和用法
const在C中的用法很灵活(相信C++中也一样),个人感觉对之既爱又恨,有时候感觉const很好用,同时又经常会因为它的优点而犯错,犯错的原因除了粗心之外,另一个更重要的,就是以前对const理解不到位。于是今天自己写成一篇小总结。如果是初学者,建议好好看一下,相信帮助比较大;如果是高手,请不吝赐教!
上面写了一段废话,就算是小序吧:)接下来就是正文;
一、关于const的具体定义:
——个人感觉很难对它下一个标准的定义,因为的用法很灵活,似乎对它定义后总无法让人能够明白它的意思,而且容易让人产生误解(也许是偶水平太菜了)。例如,把它有定义:一个能够让变量变成无法修改的常量的关键字。那么,这样的话,就可能让人误解为只要有const在定义变量里面,那变量就无论怎样都无法修改。这样的理解是很片面的(下面用法方面将对这问题做探讨)。因此,本人在此不敢对它下定义,其他参考书好象也没有下定义。
二、关于const的具体作用
——const作用就灵活了,一个表达式中const放置的位置不同,效果可能就不一样了。下面分具体情况分析(当然,所举的情况并非覆盖全部情况)
A。const最经常的用法
1.为了防止传递的函数参数不被修改,在调用函数的形参中用const关键字.
//Example -&
int FindNum(const int array[], int num, int conut);//声明函数
int FindNum(const int array[], int num, int count)
int flag = 1;
for (i = 0; (i & count) && i++)
if (array[i] == num)
上面这例子中,编译器会把array[]当作常量数据的数组看待。所以,假如你不小心给数组赋值,那么,编译器就会报错了。因此,当你不需要也不想修改数组的数据时,最好用const把数组定义为常量数组。
2.const可以用来创建数组常量、指针常量、指向常量的指针等:
const char ch = &#39;a&#39;;
const int a[5] = {1, 2, 3, 4, 5};
const int *p =
//a是一个数组的首地址.p是指向常量的指针
int * const p =
//a是一个数组的首地址.p是指针常量;
const int * const p =
//a是一个数组的首地址。p是指向常量的指针常量
前两种情况很简单,现在着重分析一下后三种用法,因为这3种情况容易出错,偶就有时候怕用错了刚脆不用const.
——const int *p =
//p是指向常量的指针,因此,不可以通过给指针赋值来改变数组
//中的数据,例如:
// *p = 10;
// *(p + 2) = 1;
//假如指向常量指针可以改变值,那么,就等于也改变了数组的数
//据了。假如你不理解,偶倒有一个办法让你理解,你就想你和一
//个人绑在一起,有可能你移动了位置而他不跟着你移动吗!哈哈
——int * const p =
//看这表达式,const的位置和第一个不同吧!他们的用法和作用
//就完全不一样了。这时候p是指针常量,我们知道,指针是指向
//了一个数组的首地址,那么,它的位置就不可以改变了。但是你
//现在应该和第一个表达式比较了,现在的数组并不是常量数组,
//所以数组的数据是可以改变的,而指针这时候它是不可以移动的
//,指向数组第一个数据,所以它可以而且只可以改变数组第一个
//数据的值。这一点请别误解,指针常量只是它的地址不可以改变
//,并不是它指向的内容一定不可以改变,这一点切记!
//好啦。假如你又不理解,偶又有一个比较形象的例子来说明:
//假如有一个固定的人拉着另外一个人的手,注意,固定的人相当
//于他是不可以由其他人来替换的。但是他可以拉其他人的手啊,
//并不一定规定他必须拉同一个人的手啊。现在你应该可以有个比
//较深的印象和理解吧:P
//下面举几个例子帮助理解:
*(p+1) = 10;
/*不可以*/
——const int * const p = //假如前面两种表达式的本质你理解了,这种表达式你来理解根本
//没有问题,const现在有两个,而且一个const的位置是第一种情
//况的位置,第二个const是第二种情况的位置,所以这表达式的功
//能就是前两种情况的作用总合。这里不多说!
//下面举几个例子帮助理解:
/*不可以*/
*(p + 2) = 10;
/*不可以*/
/*不可以*/
B。const并不会阻止参数的修改
之所以把这作为一点来谈,就是因为有一些朋友可能会以为在函数参数中用了const就一定不可以改变参数,这实际上是错误的理解,因为,它并不阻止参数的修改,下面举个简单的例子来阐述一下;
#include&stdio.h&
#include&ctype.h&
void ChangeStr(const char *String);
int main(void)
char str[] = &The C programme&;
Change(str);
printf(str);
system(&Pause&);
void ChangeStr(const char *String)
char *Source = (char *)S
while (*Source)
*Source = toupper(*Source);
上面的程序把字符串中的每个字符都转换成大写字母了。因为*String把地址给了*Source,而*Source的值的改变编译器并不干涉,可能有的编译器会发出警告之类。上面的程序只是为了说明const并不会阻止参数的修改,如果象上面程序那样,个人感觉没什么意义,只会让人容易混乱而已。
关于CONST的用法和理解本人也就只能说这么多了,当然,很可能有更多高级或者少用的用法,由于水平和经验有限,确实不能再说些什么。
三、参考文献
——《C primer plus 5th》
采纳率:27%
再间接的方式也不能改,这不符合规定。想改的话就不要定义成const常量“我指的是如何用一种间接的方式使得用const定义的变量在程序运行中可以被修改”,不知道你用的是何种间接的方式,贴出来分离一下?const定义的是常量,运行中不能改
为您推荐:
其他类似问题
您可能关注的内容
const的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 c const 数组 的文章

 

随机推荐