user-0 提问: c声明中的数组问题

回复:
user: user-1
content: 引用 40 楼 liang618 的回复:[quote=引用 38 楼 lin5161678 的回复:] [quote=引用 35 楼 liang618 的回复:]   那不是初始化值是具体值，赋值可以是具体指或者抽象值； 哪里来的 莫名其妙的具体值抽象值?  分不清什么初始化什么是赋值就看别人是怎么说的  谦虚接受   赋值在C里面是存在于表达式里面  初始化和表达式完全是两种东西  没什么关系  别看到 = 就说是赋值 这只是符号重用而已 [/quote]  好吧好吧，我只是说了我的疑问就被扣上不虚心接受的帽子， 难道你让新手一上来就说一番大道理？ 这是论坛，互相交流，各抒己见，当然你背地里骂楼主随你的便， 请不要在论坛上高高在上的说教。[/quote] 别人清清楚楚的告诉你 什么是初始化什么是初始化器的时候 你毫无根据的回复那 那不是初始化值  扯出了一个闻所未闻的 所谓具体值抽象值 不是狂妄是什么

user: user-2
content: 引用 12 楼 lanxue_1988 的回复:a是一块栈上的内存标识符，内存大小10*sizeof(int)，元素类型int 需要向要转换成其他类型的话，比如字符型，可以这样 int a[10]; char *pC = (char*)&a; a是常量不可修改，但是pC是可以修改的。。。 概念性的错误。不存在从数组类型到其它类型的转换。对于转换表达式 (T) E 来说，类型名T所指定的类型应当是： 1，void； 2，标量（原子的，限定或无限定的）。 操作数E的类型应当是标量。标量包括算术类型和指针类型，但数组类型显然不符合这个要求。将数组转换为指针显然就可以进行转换，因为指针是完整的对象类型。但即使是这样， char * pC = (char *) & a; 也显得很笨拙，毕竟，它可以直接写成 char * pC = (char *)  a; 最后，一个指示数组的标识符，比如这里的a，不是常量，不知道你从哪里得到的这种知识。

user: user-3
content: int    a[10]是一个整形数组，里面存储的时10个整数，分别是a[0]~a[9] 从0开始计算和从1开始计数是程序员和业余人士的重要区别

user: user-4
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-5
content: a是一块栈上的内存标识符，内存大小10*sizeof(int)，元素类型int 需要向要转换成其他类型的话，比如字符型，可以这样 int a[10]; char *pC = (char*)&a; a是常量不可修改，但是pC是可以修改的。。。

user: user-0
content: 四楼说的是 int a[10]表示 连续储存10个int类型 和 10个数组元素。 是一样还是不一样？ 如一样：看上下语句说明 如不一样：我理解好像一个是从整体看一个从局部看 我找个例子：

user: user-6
content: 首先int a[10]不是一个常量， 是一个int型数组变量， 只不过和一般的常用类型变量赋值不太一样而已。

user: user-7
content: 严重同意3楼的说法。

user: user-8
content: 1  a是10个int的数组，把字符串赋值是什么意思？ 2 a里面有10个int

user: user-4
content: 想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-4
content: 引用 26 楼 sholber 的回复:[quote=引用 24 楼 liang618 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 赵老师推荐些书看呗，肚里墨水少，想学习数据库方向的，从低到高需要啃哪些书呢？[/quote] 你让他推荐？他指定给你推荐MS-DOS 6.22 + Visual Forpro 2.5，或者Foxbase。说不定给你推荐个更早的：dBase III[/quote] 我推荐看随便哪一版的中文SQL Server联机文档。

user: user-0
content: 引用 38 楼 lin5161678 的回复:[quote=引用 35 楼 liang618 的回复:]   那不是初始化值是具体值，赋值可以是具体指或者抽象值； 哪里来的 莫名其妙的具体值抽象值?  分不清什么初始化什么是赋值就看别人是怎么说的  谦虚接受   赋值在C里面是存在于表达式里面  初始化和表达式完全是两种东西  没什么关系  别看到 = 就说是赋值 这只是符号重用而已 [/quote]  好吧好吧，我只是说了我的疑问就被扣上不虚心接受的帽子， 难道你让新手一上来就说一番大道理？ 这是论坛，互相交流，各抒己见，当然你背地里骂楼主随你的便， 请不要在论坛上高高在上的说教。

user: user-0
content: 引用 37 楼 sholber 的回复:[quote=引用 34 楼 liang618 的回复:] [quote=引用 30 楼 sholber 的回复:] [quote=引用 28 楼 liang618 的回复:] [quote=引用 7 楼 sholber 的回复:] [quote=引用 5 楼 u012881352 的回复:] 牛头不对马嘴。没认真学基础的知识吧？  a是一个变量名，它代表的变量是一个类型为int的数组变量 而变量a的内容是该变量在内存中的首地址，即a[0] 嘎嘎~这种说法是不对滴~ 首先，数组也是一种数据类型，“类型为int的数组”说不通，“int类型的数组”也不对。数组类型就是数组类型，元素类型就是元素类型，你可以说“元素类型为int的数组”，这没问题； 其次，因为a是数组，所以，变量a的内容是数组的内容，而不是数组的首地址。数组是对象类型（相对于函数类型），对象类型都是有值的。数组对象的值就是数组里存储的内容。[/quote]  int a[10] 变量a称为数组，a[4]的类型是整型，数组名a是指向int的常量指针，数组不等同于指针，数组具有确定数量的元素，而指针只是一个标量值。编译器用数组名来记住这些属性。只有在数组名在表达式中使用时，编译器才会为它产生一个指针常量。[/quote]  1，你先说“数组名a是指向int的常量指针”，然后又说“数组不等同于指针”，这个互相矛盾； 2，你说“数组名a是指向int的常量指针”，“只有在数组名在表达式中使用时，编译器才会为它产生一个指针常量”，那么试问，在下面的表达式中，如果数组名被转换为指针，它是怎么得到数组大小的： size_t t = sizeof (a); 3，“常量指针”和“指针常量”在C标准中，用于指那些声明为const限定的指针： int * const p; 试问，数组名是怎么成为常量指针的？我翻遍最新的C标准，也没发现。请你明示。 [/quote]   以下为《c和指针》P141 原文： 考虑下面这些声明： int a； int b[10]；     我们把变量a称为标量，因为它是一个单一的值，这个变量的类型是一个整数。我们把变量b称为数组，因为它是一些值的集合。下标和数组名一起使用，用于标识该集合中某个特定的值。     b[4]的类型是整型，但b的类型呢？在C中，几乎所有使用数组名的表达式中，数组名的值是一个指针常量，也就是数组第一个元素的地址。它的类型取决于数组元素的类型：如果它们是int类型，那么数组名的类型就是“指向int的常量指针”。     请不要根据这个事实得出数组和指针是相同的结论。数组具有一些和指针完全不同的特征。例如，数组具有确定数量的元素，而指针只是一个标量值。编译器用数组名来记住这些属性。只有在数组名在表达式中使用时，编译器才会为它产生一个指针常量。      注意这个值是指针常量，而不是指针变量。你不能修改常量的值。你只要稍微回想一下，就会认为这个限制是合理的：指针常量所指向的是内存中数组的起始位置，如果修改这个指针常量，唯一可行的操作就是把整个数组移动到内存的其他位置。但是，在程序完成链接之后，内存中数组的位置是固定的，所以当程序运行时，再想移动数组就为时已晚了。因此，数组名的只是一个指针常量。     只有在两种场合下，数组名并不用指针常量来表示————就是当数组名作为sizeof操作符或单目操作符&的操作数时，siozeof返回整个数组的长度，而不是指向数组的指针的长度。取一个数组名的地址所产生的是一个指向数组的指针，而不是一个指向某个指针常量的指针。[/quote]  1，我曾经说过，有些书的本意是通俗易懂，但它们造成了更多的混乱，相比之下，它们的价值十分微弱。 首先，“我们把变量a称为标量”。这个十分可笑。也许是翻译的问题吧。标量是指算术类型的指针类型，充其量它可以这样说“变量a是标量”。还有，“这个变量的类型是一个整数”，怎么念怎么别扭。一个整数也成了类型？当然，也许是翻译问题，这些语文方面的偏差放下不表。 2，“我们把变量b称为数组，因为它是一些值的集合。”这个也十分滴荒谬，嘎嘎~~，在C中，类型（types）分为对象类型（object types）和函数类型（function types），前者用于描述对象，后者用于描述函数。每个对象都会有一个值（void类型也是对象类型，它具有空值，或者不存在的值），包括数组类型的对象。你不能武断地说数组不是一个对象，或者说数组是值的集合，这是十分可笑的。 3，“下标和数组名一起使用，用于标识该集合中某个特定的值。”这也是胡说八道。下标表达式的结果要看它的位置，有时指示一个数组元素，有时用于计算一个值。比如： int x = a [3], * px = & a [3]; 如果a [3]仅仅计算一个值，它是怎么用&生成一个指针的？ 4，“请不要根据这个事实得出数组和指针是相同的结论。”这就是典型的不要脸了。未必所有人都认为它们是相同的——在C标准中，数组并没有被特殊对待，它也是普通的对象类型，数组类型的对象也是普通的对象类型。有些书自说自话，提出一些他们自己没想清楚的、自己觉得是问题的问题，搅浑了一池清水，最后得了一个模棱两可的、他们自己也没有准确回答的结论。这些人是怎么想的不知道，我只知道他们是一群混蛋。 5，“注意这个值是指针常量，而不是指针变量。你不能修改常量的值。你只要稍微回想一下，就会认为这个限制是合理的：指针常量所指向的是内存中数组的起始位置，如果修改这个指针常量，唯一可行的操作就是把整个数组移动到内存的其他位置。”数组会转换为指针常量，这个，嘎嘎，C从来没说过，可以当放炮。另外，按它的逻辑，int i;这个i的地址也是不能随便乱动的，也同样是指针常量了。 6，其它问题不再一一解释。《C和指针》这本书没看过，不过我有PDF。建议大家不要乱看书。[/quote]  能留个联系方式吗？如果用qq的话，楼主qq：44326334 有问题请教

user: user-1
content: 引用 35 楼 liang618 的回复:那不是初始化值是具体值，赋值可以是具体指或者抽象值； 哪里来的 莫名其妙的具体值抽象值?  分不清什么初始化什么是赋值就看别人是怎么说的  谦虚接受   赋值在C里面是存在于表达式里面  初始化和表达式完全是两种东西  没什么关系  别看到 = 就说是赋值 这只是符号重用而已

user: user-2
content: 引用 34 楼 liang618 的回复:[quote=引用 30 楼 sholber 的回复:] [quote=引用 28 楼 liang618 的回复:] [quote=引用 7 楼 sholber 的回复:] [quote=引用 5 楼 u012881352 的回复:] 牛头不对马嘴。没认真学基础的知识吧？  a是一个变量名，它代表的变量是一个类型为int的数组变量 而变量a的内容是该变量在内存中的首地址，即a[0] 嘎嘎~这种说法是不对滴~ 首先，数组也是一种数据类型，“类型为int的数组”说不通，“int类型的数组”也不对。数组类型就是数组类型，元素类型就是元素类型，你可以说“元素类型为int的数组”，这没问题； 其次，因为a是数组，所以，变量a的内容是数组的内容，而不是数组的首地址。数组是对象类型（相对于函数类型），对象类型都是有值的。数组对象的值就是数组里存储的内容。[/quote]  int a[10] 变量a称为数组，a[4]的类型是整型，数组名a是指向int的常量指针，数组不等同于指针，数组具有确定数量的元素，而指针只是一个标量值。编译器用数组名来记住这些属性。只有在数组名在表达式中使用时，编译器才会为它产生一个指针常量。[/quote]  1，你先说“数组名a是指向int的常量指针”，然后又说“数组不等同于指针”，这个互相矛盾； 2，你说“数组名a是指向int的常量指针”，“只有在数组名在表达式中使用时，编译器才会为它产生一个指针常量”，那么试问，在下面的表达式中，如果数组名被转换为指针，它是怎么得到数组大小的： size_t t = sizeof (a); 3，“常量指针”和“指针常量”在C标准中，用于指那些声明为const限定的指针： int * const p; 试问，数组名是怎么成为常量指针的？我翻遍最新的C标准，也没发现。请你明示。 [/quote]   以下为《c和指针》P141 原文： 考虑下面这些声明： int a； int b[10]；     我们把变量a称为标量，因为它是一个单一的值，这个变量的类型是一个整数。我们把变量b称为数组，因为它是一些值的集合。下标和数组名一起使用，用于标识该集合中某个特定的值。     b[4]的类型是整型，但b的类型呢？在C中，几乎所有使用数组名的表达式中，数组名的值是一个指针常量，也就是数组第一个元素的地址。它的类型取决于数组元素的类型：如果它们是int类型，那么数组名的类型就是“指向int的常量指针”。     请不要根据这个事实得出数组和指针是相同的结论。数组具有一些和指针完全不同的特征。例如，数组具有确定数量的元素，而指针只是一个标量值。编译器用数组名来记住这些属性。只有在数组名在表达式中使用时，编译器才会为它产生一个指针常量。      注意这个值是指针常量，而不是指针变量。你不能修改常量的值。你只要稍微回想一下，就会认为这个限制是合理的：指针常量所指向的是内存中数组的起始位置，如果修改这个指针常量，唯一可行的操作就是把整个数组移动到内存的其他位置。但是，在程序完成链接之后，内存中数组的位置是固定的，所以当程序运行时，再想移动数组就为时已晚了。因此，数组名的只是一个指针常量。     只有在两种场合下，数组名并不用指针常量来表示————就是当数组名作为sizeof操作符或单目操作符&的操作数时，siozeof返回整个数组的长度，而不是指向数组的指针的长度。取一个数组名的地址所产生的是一个指向数组的指针，而不是一个指向某个指针常量的指针。[/quote]  1，我曾经说过，有些书的本意是通俗易懂，但它们造成了更多的混乱，相比之下，它们的价值十分微弱。 首先，“我们把变量a称为标量”。这个十分可笑。也许是翻译的问题吧。标量是指算术类型的指针类型，充其量它可以这样说“变量a是标量”。还有，“这个变量的类型是一个整数”，怎么念怎么别扭。一个整数也成了类型？当然，也许是翻译问题，这些语文方面的偏差放下不表。 2，“我们把变量b称为数组，因为它是一些值的集合。”这个也十分滴荒谬，嘎嘎~~，在C中，类型（types）分为对象类型（object types）和函数类型（function types），前者用于描述对象，后者用于描述函数。每个对象都会有一个值（void类型也是对象类型，它具有空值，或者不存在的值），包括数组类型的对象。你不能武断地说数组不是一个对象，或者说数组是值的集合，这是十分可笑的。 3，“下标和数组名一起使用，用于标识该集合中某个特定的值。”这也是胡说八道。下标表达式的结果要看它的位置，有时指示一个数组元素，有时用于计算一个值。比如： int x = a [3], * px = & a [3]; 如果a [3]仅仅计算一个值，它是怎么用&生成一个指针的？ 4，“请不要根据这个事实得出数组和指针是相同的结论。”这就是典型的不要脸了。未必所有人都认为它们是相同的——在C标准中，数组并没有被特殊对待，它也是普通的对象类型，数组类型的对象也是普通的对象类型。有些书自说自话，提出一些他们自己没想清楚的、自己觉得是问题的问题，搅浑了一池清水，最后得了一个模棱两可的、他们自己也没有准确回答的结论。这些人是怎么想的不知道，我只知道他们是一群混蛋。 5，“注意这个值是指针常量，而不是指针变量。你不能修改常量的值。你只要稍微回想一下，就会认为这个限制是合理的：指针常量所指向的是内存中数组的起始位置，如果修改这个指针常量，唯一可行的操作就是把整个数组移动到内存的其他位置。”数组会转换为指针常量，这个，嘎嘎，C从来没说过，可以当放炮。另外，按它的逻辑，int i;这个i的地址也是不能随便乱动的，也同样是指针常量了。 6，其它问题不再一一解释。《C和指针》这本书没看过，不过我有PDF。建议大家不要乱看书。

user: user-0
content: 引用 33 楼 lanxue_1988 的回复:[quote=引用 25 楼 sholber 的回复:] [quote=引用 21 楼 lanxue_1988 的回复:] [quote=引用 19 楼 sholber 的回复:] [quote=引用 17 楼 lanxue_1988 的回复:] [quote=引用 15 楼 sholber 的回复:]  概念性的错误。不存在从数组类型到其它类型的转换。对于转换表达式 a 说到底只是一个地址，至于，这块地址上的内容如何解释，是由类型决定的， 这有什么问题吗？[/quote]  如果a只是一个地址，那么表达式&a怎么解释？取一个地址的地址？ 你能分得清标识符、对象、值之三者之间的关系吗？ [/quote] &a和a的值都是一样的，不一样的类型 int a[10]; // 比如 a+1//的值为a+1 &a +1 //的值为 &a + sizeof(a) 即 &a + 10*sizeof(int) [/quote] 你得先弄清楚“值”的概念。按照C标准的定义，值（value）是用对象所属的类型来解释的、精度意义上的内容。 所以，值一样，类型不同，这是个矛盾的、不明所以的说法，嘎嘎~~ C语言里有个术语叫“对象表示（object representation）”，专门用来描述对象的底层数据表示方法，你可以说表达式&a和a的值具有相同的对象表示，但这不意味着它们具有相同的值哩。 还有，a+1的值是a+1，这是个什么意思？我知道你的意思，但你的表述太乱。只能这么说，你读的书都打着通俗的旗号，干了混淆概念，滥造术语的勾当，这些书的影响实在太坏了。嘎嘎~~ [/quote] "指向不同类型的指针"在内存上均是一个地址,无任何差异,其不同之处在于其所寻址出来的objec类型不同,也就是说,"指针类型"会教导编译器如何解释某个特定地址中的内存内容以及其大小. 其实，我本意只想说，int a[10] ;就是一块内存，怎么使用可以灵活处理，只要编译器不抱怨，内存不越界就ok了。  还好你站出来指正了这么严重的概念性错误，不然，就又坑害了一些大好青年~~~[/quote]  要不要这么难，不好理解。

user: user-0
content: 引用 32 楼 sholber 的回复:[quote=引用 31 楼 liang618 的回复:] [quote=引用 18 楼 sholber 的回复:] [quote=引用 16 楼 liang618 的回复:] 你们都跑题了 没懂我的意思 只有四楼说对第一个问题。 char a[10] scanf(''%s'',a) printf(''%s'',a) 那么可以输出一个如“world”的字符串，这个数组就可以解释成一行10个的储存单元，每个单元储存一个字符，空字符\o结尾。  char a[10]={a,b,c,…}；是给数组初始化赋值，如a[0]=a,  a[1]=b…  我们讨论的内容延伸自你的问题……嘎嘎……我们讨论我们的，不影响，嘎嘎~ 初始化和赋值不是一回事，也不存在所谓的初始化赋值。[/quote]  初始化和赋值有啥不同？ 求解释[/quote]  初始化是指，在对象创建时，为它赋予一个初始值，这个初始值是在对象声明时，由声明语法中的初始化器（initializer）指定的。典型地，对于声明 int x = 100, (* f) (const char ...) = printf; 这里的printf和100就是初始化器。 赋值，是指赋值表达式修改对象的存储值的副作用。即使新值和原值相同，也算是修改。典型地，赋值表达式的例子可以是 x += 2[/quote]  那不是初始化值是具体值，赋值可以是具体指或者抽象值；

user: user-0
content: 引用 30 楼 sholber 的回复:[quote=引用 28 楼 liang618 的回复:] [quote=引用 7 楼 sholber 的回复:] [quote=引用 5 楼 u012881352 的回复:] 牛头不对马嘴。没认真学基础的知识吧？  a是一个变量名，它代表的变量是一个类型为int的数组变量 而变量a的内容是该变量在内存中的首地址，即a[0] 嘎嘎~这种说法是不对滴~ 首先，数组也是一种数据类型，“类型为int的数组”说不通，“int类型的数组”也不对。数组类型就是数组类型，元素类型就是元素类型，你可以说“元素类型为int的数组”，这没问题； 其次，因为a是数组，所以，变量a的内容是数组的内容，而不是数组的首地址。数组是对象类型（相对于函数类型），对象类型都是有值的。数组对象的值就是数组里存储的内容。[/quote]  int a[10] 变量a称为数组，a[4]的类型是整型，数组名a是指向int的常量指针，数组不等同于指针，数组具有确定数量的元素，而指针只是一个标量值。编译器用数组名来记住这些属性。只有在数组名在表达式中使用时，编译器才会为它产生一个指针常量。[/quote]  1，你先说“数组名a是指向int的常量指针”，然后又说“数组不等同于指针”，这个互相矛盾； 2，你说“数组名a是指向int的常量指针”，“只有在数组名在表达式中使用时，编译器才会为它产生一个指针常量”，那么试问，在下面的表达式中，如果数组名被转换为指针，它是怎么得到数组大小的： size_t t = sizeof (a); 3，“常量指针”和“指针常量”在C标准中，用于指那些声明为const限定的指针： int * const p; 试问，数组名是怎么成为常量指针的？我翻遍最新的C标准，也没发现。请你明示。 [/quote]   以下为《c和指针》P141 原文： 考虑下面这些声明： int a； int b[10]；     我们把变量a称为标量，因为它是一个单一的值，这个变量的类型是一个整数。我们把变量b称为数组，因为它是一些值的集合。下标和数组名一起使用，用于标识该集合中某个特定的值。     b[4]的类型是整型，但b的类型呢？在C中，几乎所有使用数组名的表达式中，数组名的值是一个指针常量，也就是数组第一个元素的地址。它的类型取决于数组元素的类型：如果它们是int类型，那么数组名的类型就是“指向int的常量指针”。     请不要根据这个事实得出数组和指针是相同的结论。数组具有一些和指针完全不同的特征。例如，数组具有确定数量的元素，而指针只是一个标量值。编译器用数组名来记住这些属性。只有在数组名在表达式中使用时，编译器才会为它产生一个指针常量。      注意这个值是指针常量，而不是指针变量。你不能修改常量的值。你只要稍微回想一下，就会认为这个限制是合理的：指针常量所指向的是内存中数组的起始位置，如果修改这个指针常量，唯一可行的操作就是把整个数组移动到内存的其他位置。但是，在程序完成链接之后，内存中数组的位置是固定的，所以当程序运行时，再想移动数组就为时已晚了。因此，数组名的只是一个指针常量。     只有在两种场合下，数组名并不用指针常量来表示————就是当数组名作为sizeof操作符或单目操作符&的操作数时，siozeof返回整个数组的长度，而不是指向数组的指针的长度。取一个数组名的地址所产生的是一个指向数组的指针，而不是一个指向某个指针常量的指针。

user: user-5
content: 引用 25 楼 sholber 的回复:[quote=引用 21 楼 lanxue_1988 的回复:] [quote=引用 19 楼 sholber 的回复:] [quote=引用 17 楼 lanxue_1988 的回复:] [quote=引用 15 楼 sholber 的回复:]  概念性的错误。不存在从数组类型到其它类型的转换。对于转换表达式 a 说到底只是一个地址，至于，这块地址上的内容如何解释，是由类型决定的， 这有什么问题吗？[/quote]  如果a只是一个地址，那么表达式&a怎么解释？取一个地址的地址？ 你能分得清标识符、对象、值之三者之间的关系吗？ [/quote] &a和a的值都是一样的，不一样的类型 int a[10]; // 比如 a+1//的值为a+1 &a +1 //的值为 &a + sizeof(a) 即 &a + 10*sizeof(int) [/quote] 你得先弄清楚“值”的概念。按照C标准的定义，值（value）是用对象所属的类型来解释的、精度意义上的内容。 所以，值一样，类型不同，这是个矛盾的、不明所以的说法，嘎嘎~~ C语言里有个术语叫“对象表示（object representation）”，专门用来描述对象的底层数据表示方法，你可以说表达式&a和a的值具有相同的对象表示，但这不意味着它们具有相同的值哩。 还有，a+1的值是a+1，这是个什么意思？我知道你的意思，但你的表述太乱。只能这么说，你读的书都打着通俗的旗号，干了混淆概念，滥造术语的勾当，这些书的影响实在太坏了。嘎嘎~~ [/quote] "指向不同类型的指针"在内存上均是一个地址,无任何差异,其不同之处在于其所寻址出来的objec类型不同,也就是说,"指针类型"会教导编译器如何解释某个特定地址中的内存内容以及其大小. 其实，我本意只想说，int a[10] ;就是一块内存，怎么使用可以灵活处理，只要编译器不抱怨，内存不越界就ok了。  还好你站出来指正了这么严重的概念性错误，不然，就又坑害了一些大好青年~~~

user: user-2
content: 引用 31 楼 liang618 的回复:[quote=引用 18 楼 sholber 的回复:] [quote=引用 16 楼 liang618 的回复:] 你们都跑题了 没懂我的意思 只有四楼说对第一个问题。 char a[10] scanf(''%s'',a) printf(''%s'',a) 那么可以输出一个如“world”的字符串，这个数组就可以解释成一行10个的储存单元，每个单元储存一个字符，空字符\o结尾。  char a[10]={a,b,c,…}；是给数组初始化赋值，如a[0]=a,  a[1]=b…  我们讨论的内容延伸自你的问题……嘎嘎……我们讨论我们的，不影响，嘎嘎~ 初始化和赋值不是一回事，也不存在所谓的初始化赋值。[/quote]  初始化和赋值有啥不同？ 求解释[/quote]  初始化是指，在对象创建时，为它赋予一个初始值，这个初始值是在对象声明时，由声明语法中的初始化器（initializer）指定的。典型地，对于声明 int x = 100, (* f) (const char ...) = printf; 这里的printf和100就是初始化器。 赋值，是指赋值表达式修改对象的存储值的副作用。即使新值和原值相同，也算是修改。典型地，赋值表达式的例子可以是 x += 2