user-0 提问: 关于指针数组初始化

回复:
user: user-1
content: 引用 2 楼 u010470077 的回复:不可以。指针的初始化或赋值可以使用0值常亮表达式和类型匹配的对象的地址。 如上，字符串字面值常量类型为const char *，与指针类型匹配，可赋值。但整形字面值常量并不是int类型，故而不可赋给int *类型指针 你有什么证据证明串字面值的类型是const char *？ 你有什么证据证明整型常量1、2、3、4、5不是int类型？

user: user-1
content: 引用 7 楼 u010470077 的回复:[quote=引用 5 楼 sholber 的回复:] [quote=引用 4 楼 u010470077 的回复:] [quote=引用 3 楼 sholber 的回复:] [quote=引用 2 楼 u010470077 的回复:] 不可以。指针的初始化或赋值可以使用0值常亮表达式和类型匹配的对象的地址。 如上，字符串字面值常量类型为const char *，与指针类型匹配，可赋值。但整形字面值常量并不是int类型，故而不可赋给int *类型指针 你有什么证据证明串字面值的类型是const char *？ 你有什么证据证明整型常量1、2、3、4、5不是int类型？[/quote]  不好意思，昨晚太匆忙，以致出现回答错误。十分抱歉 首先楼主问题的正确解释应该为以下内容： 1、字符串字面值常量赋给指针时，会隐含地将此字符串内存单元首地址赋给指针。 2、字符串字面值常量的类型也确实为const char *类型，例如在VS2010中编写以下代码时，编译器报错时会提示字符串字面值常量为const char *，也符合类型匹配原则。 int *names[] = {"abxd", "sefh"}; 3、整形字面值常量可以为int, long等类型，详见《C++ Primer》第二章2.2节。但给指针赋值应该是地址，即&i，VS2010下编译错误也会提示：不可将int 类型赋给int *类型。 最后也感谢3楼的提醒与质疑。[/quote]  首先，用编译器来验证串字面值的类型本身就是不对的，更何况你用的是VS2010之类的编译器。如果能用编译器来说明问题，那么，对于以下代码，我用gcc和clang得到的结果和你的不同，你又如何解释： printf("%d, %d\n", sizeof (const char *), sizeof "hello!"); 另外，你这个const也不知从何而来。建议你在gcc上试试这个： "hello!"[0] = 1; 尽管它是未定义的，但毕竟它不会告诉你"hello!"[0]是只读对象。 其它用语不严谨的问题就不说了。串字面值到底是什么，还得看标准。[/quote]  好吧，既然如此，我只能拿出经典来证明了，在《C++ Primer》第4章4.3节C风格字符串中明确提到：”字符串字面值的类型就是const char 类型的数组" 还有你这样公开地说楼主大哈瓜，是不是太不考虑别人感受了？[/quote]  用编译器解释不了，就用教材来解释？《C++ Primer》没看过，不知道是不是经典，但很多人认为谭浩强的C也很经典，是不是可以用谭浩强的书来解释呢？ 言归正传，你至少承认串字面值是数组了。不过，这个const，C和C++是不一样的。你需要明确地解释，串字面值的类型到底是不是const限定的。不要再用《C++ Primer》，那是C++，而且不是所有人都承认它是经典。 最好的办法是引用C标准文档中的条文来解释，而不是用别的书或者编译器，那都是靠不住的。  PS：我认为楼主的确是大哈瓜。

user: user-2
content: 引用 5 楼 sholber 的回复:[quote=引用 4 楼 u010470077 的回复:] [quote=引用 3 楼 sholber 的回复:] [quote=引用 2 楼 u010470077 的回复:] 不可以。指针的初始化或赋值可以使用0值常亮表达式和类型匹配的对象的地址。 如上，字符串字面值常量类型为const char *，与指针类型匹配，可赋值。但整形字面值常量并不是int类型，故而不可赋给int *类型指针 你有什么证据证明串字面值的类型是const char *？ 你有什么证据证明整型常量1、2、3、4、5不是int类型？[/quote]  不好意思，昨晚太匆忙，以致出现回答错误。十分抱歉 首先楼主问题的正确解释应该为以下内容： 1、字符串字面值常量赋给指针时，会隐含地将此字符串内存单元首地址赋给指针。 2、字符串字面值常量的类型也确实为const char *类型，例如在VS2010中编写以下代码时，编译器报错时会提示字符串字面值常量为const char *，也符合类型匹配原则。 int *names[] = {"abxd", "sefh"}; 3、整形字面值常量可以为int, long等类型，详见《C++ Primer》第二章2.2节。但给指针赋值应该是地址，即&i，VS2010下编译错误也会提示：不可将int 类型赋给int *类型。 最后也感谢3楼的提醒与质疑。[/quote]  首先，用编译器来验证串字面值的类型本身就是不对的，更何况你用的是VS2010之类的编译器。如果能用编译器来说明问题，那么，对于以下代码，我用gcc和clang得到的结果和你的不同，你又如何解释： printf("%d, %d\n", sizeof (const char *), sizeof "hello!"); 另外，你这个const也不知从何而来。建议你在gcc上试试这个： "hello!"[0] = 1; 尽管它是未定义的，但毕竟它不会告诉你"hello!"[0]是只读对象。 其它用语不严谨的问题就不说了。串字面值到底是什么，还得看标准。[/quote]  好吧，既然如此，我只能拿出经典来证明了，在《C++ Primer》第4章4.3节C风格字符串中明确提到：”字符串字面值的类型就是const char 类型的数组" 还有你这样公开地说楼主大哈瓜，是不是太不考虑别人感受了？

user: user-1
content: 楼主这个大哈瓜，问题没搞清楚就结帖了，还把分给了回答错误的人，无语鸟。

user: user-1
content: 引用 4 楼 u010470077 的回复:[quote=引用 3 楼 sholber 的回复:] [quote=引用 2 楼 u010470077 的回复:] 不可以。指针的初始化或赋值可以使用0值常亮表达式和类型匹配的对象的地址。 如上，字符串字面值常量类型为const char *，与指针类型匹配，可赋值。但整形字面值常量并不是int类型，故而不可赋给int *类型指针 你有什么证据证明串字面值的类型是const char *？ 你有什么证据证明整型常量1、2、3、4、5不是int类型？[/quote]  不好意思，昨晚太匆忙，以致出现回答错误。十分抱歉 首先楼主问题的正确解释应该为以下内容： 1、字符串字面值常量赋给指针时，会隐含地将此字符串内存单元首地址赋给指针。 2、字符串字面值常量的类型也确实为const char *类型，例如在VS2010中编写以下代码时，编译器报错时会提示字符串字面值常量为const char *，也符合类型匹配原则。 int *names[] = {"abxd", "sefh"}; 3、整形字面值常量可以为int, long等类型，详见《C++ Primer》第二章2.2节。但给指针赋值应该是地址，即&i，VS2010下编译错误也会提示：不可将int 类型赋给int *类型。 最后也感谢3楼的提醒与质疑。[/quote]  首先，用编译器来验证串字面值的类型本身就是不对的，更何况你用的是VS2010之类的编译器。如果能用编译器来说明问题，那么，对于以下代码，我用gcc和clang得到的结果和你的不同，你又如何解释： printf("%d, %d\n", sizeof (const char *), sizeof "hello!"); 另外，你这个const也不知从何而来。建议你在gcc上试试这个： "hello!"[0] = 1; 尽管它是未定义的，但毕竟它不会告诉你"hello!"[0]是只读对象。 其它用语不严谨的问题就不说了。串字面值到底是什么，还得看标准。

user: user-2
content: 引用 3 楼 sholber 的回复:[quote=引用 2 楼 u010470077 的回复:] 不可以。指针的初始化或赋值可以使用0值常亮表达式和类型匹配的对象的地址。 如上，字符串字面值常量类型为const char *，与指针类型匹配，可赋值。但整形字面值常量并不是int类型，故而不可赋给int *类型指针 你有什么证据证明串字面值的类型是const char *？ 你有什么证据证明整型常量1、2、3、4、5不是int类型？[/quote]  不好意思，昨晚太匆忙，以致出现回答错误。十分抱歉 首先楼主问题的正确解释应该为以下内容： 1、字符串字面值常量赋给指针时，会隐含地将此字符串内存单元首地址赋给指针。 2、字符串字面值常量的类型也确实为const char *类型，例如在VS2010中编写以下代码时，编译器报错时会提示字符串字面值常量为const char *，也符合类型匹配原则。 int *names[] = {"abxd", "sefh"}; 3、整形字面值常量可以为int, long等类型，详见《C++ Primer》第二章2.2节。但给指针赋值应该是地址，即&i，VS2010下编译错误也会提示：不可将int 类型赋给int *类型。 最后也感谢3楼的提醒与质疑。

user: user-2
content: 不可以。指针的初始化或赋值可以使用0值常亮表达式和类型匹配的对象的地址。 如上，字符串字面值常量类型为const char *，与指针类型匹配，可赋值。但整形字面值常量并不是int类型，故而不可赋给int *类型指针

user: user-3
content: 不可以