#include "stdafx.h"
#include <iostream>
#include <windows.h>
class Abc
{
public:
static const int a = 123;
};
int _tmain(int argc, _TCHAR* argv[])
{
Abc *p=NULL;
Abc a1;
Abc a2;
p[23] = a1;
p[99] = a2;
printf("%d",p[23].a);
getchar();
return 0;
}
这段代码可以编译运行,其中p[23] p[99]这是什么用法?
这是数组吗?但是既没有分配内存空间,也没有从0开始。 这个是下标吗?
调试的时候貌似不能在这里断点。
系统如何分配内存,p[23]和p[99]在内存里有啥联系?
好多疑问~~ 请高手赐教~~
15 个解决方案
#1
这个很好理解:
Abc *p=NULL:指p指向类Abc,且给p初值为NULL(0);p[23]相当于p[0+23];其中[]中的数字为地址,计算方法等同于数组的下标计算一样;p[23]和p[99]联系就像数组a[1]与a[3]关系一样。
Abc *p=NULL:指p指向类Abc,且给p初值为NULL(0);p[23]相当于p[0+23];其中[]中的数字为地址,计算方法等同于数组的下标计算一样;p[23]和p[99]联系就像数组a[1]与a[3]关系一样。
#3
这段代码可以编译运行吗?我怎么运行不了
#4
p[23] = a1;<=> *(p+23)=a1;
#5
等价的
#6
跟数组一样,问题是你这确实能运行?
#7
不能运行。p被指向NULL,那里是不能存放东西的。
#8
指针数组
#9
首先 指针是可以这样用的
其次 p[23]里面放的东西可能不能乱改——这只是我的推测,这样写 会引起崩溃
但我没有在编译器里试验你的代码
其次 p[23]里面放的东西可能不能乱改——这只是我的推测,这样写 会引起崩溃
但我没有在编译器里试验你的代码
#10
http://c-faq-chn.sourceforge.net/ccfaq/node83.html
7.8 我遇到一些 ``搞笑" 的代码, 包含 5["abcdef"] 这样的 ``表达式"。 这为什么是合法的 C 表达式呢 ?
是的, 弗吉尼亚7.1, 数组和下标在 C 语言中可以互换。这个奇怪的事实来自数组 下标的指针定义, 即对于任何两个表达式 a 和 e, 只要其中一个是 指针表达式而另一个为整数, 则 a[e] 和 *((a)+(e)) 完全一样。这种交换性 在许多 C 语言的书中被看作值得骄傲的东西, 但是它除了在混乱 C 语言竞赛 之外, 其实鲜有用武之地。
参考资料: [Rationale, Sec. 3.3.2.1]; [H&S, Sec. 5.4.1 p. 124, Sec. 7.4.1 pp. 186-7]。
脚注
... 弗吉尼亚7.1
这里有个美国典故, 在 1897 年, 有个叫 弗吉尼亚 (Virginia) 的八岁小女孩, 她对圣诞老人是否存在感到困惑, 因而写了封寻问信给《纽约太阳报》, 于是就有了 ``Yes, Virginia, there is a Santa Claus" 这篇评论, 有兴趣的朋友可以在 http://www.hymnsandcarolsofchristmas.com/santa/virginia's_question.htm 找到相关资料。
7.8 我遇到一些 ``搞笑" 的代码, 包含 5["abcdef"] 这样的 ``表达式"。 这为什么是合法的 C 表达式呢 ?
是的, 弗吉尼亚7.1, 数组和下标在 C 语言中可以互换。这个奇怪的事实来自数组 下标的指针定义, 即对于任何两个表达式 a 和 e, 只要其中一个是 指针表达式而另一个为整数, 则 a[e] 和 *((a)+(e)) 完全一样。这种交换性 在许多 C 语言的书中被看作值得骄傲的东西, 但是它除了在混乱 C 语言竞赛 之外, 其实鲜有用武之地。
参考资料: [Rationale, Sec. 3.3.2.1]; [H&S, Sec. 5.4.1 p. 124, Sec. 7.4.1 pp. 186-7]。
脚注
... 弗吉尼亚7.1
这里有个美国典故, 在 1897 年, 有个叫 弗吉尼亚 (Virginia) 的八岁小女孩, 她对圣诞老人是否存在感到困惑, 因而写了封寻问信给《纽约太阳报》, 于是就有了 ``Yes, Virginia, there is a Santa Claus" 这篇评论, 有兴趣的朋友可以在 http://www.hymnsandcarolsofchristmas.com/santa/virginia's_question.htm 找到相关资料。
#11
我的没崩溃,不过p[23]好让人揪心啊
#12
但是他又没有像数组那样事先给出数组的长度,那么这么使用会不会使内存混乱。
#13
我看到别人的代码里有这么用,因为不了解,所以也很揪心。
看了大家的回帖,这个用法可以理解为指针的位移?但是这么用对内存是安全的吗?
#14
表示学习了,不过p为NULL哎
#15
编译通过,说明语法没问题,但你这个程序存在很大的问题。
#1
这个很好理解:
Abc *p=NULL:指p指向类Abc,且给p初值为NULL(0);p[23]相当于p[0+23];其中[]中的数字为地址,计算方法等同于数组的下标计算一样;p[23]和p[99]联系就像数组a[1]与a[3]关系一样。
Abc *p=NULL:指p指向类Abc,且给p初值为NULL(0);p[23]相当于p[0+23];其中[]中的数字为地址,计算方法等同于数组的下标计算一样;p[23]和p[99]联系就像数组a[1]与a[3]关系一样。
#2
#3
这段代码可以编译运行吗?我怎么运行不了
#4
p[23] = a1;<=> *(p+23)=a1;
#5
等价的
#6
跟数组一样,问题是你这确实能运行?
#7
不能运行。p被指向NULL,那里是不能存放东西的。
#8
指针数组
#9
首先 指针是可以这样用的
其次 p[23]里面放的东西可能不能乱改——这只是我的推测,这样写 会引起崩溃
但我没有在编译器里试验你的代码
其次 p[23]里面放的东西可能不能乱改——这只是我的推测,这样写 会引起崩溃
但我没有在编译器里试验你的代码
#10
http://c-faq-chn.sourceforge.net/ccfaq/node83.html
7.8 我遇到一些 ``搞笑" 的代码, 包含 5["abcdef"] 这样的 ``表达式"。 这为什么是合法的 C 表达式呢 ?
是的, 弗吉尼亚7.1, 数组和下标在 C 语言中可以互换。这个奇怪的事实来自数组 下标的指针定义, 即对于任何两个表达式 a 和 e, 只要其中一个是 指针表达式而另一个为整数, 则 a[e] 和 *((a)+(e)) 完全一样。这种交换性 在许多 C 语言的书中被看作值得骄傲的东西, 但是它除了在混乱 C 语言竞赛 之外, 其实鲜有用武之地。
参考资料: [Rationale, Sec. 3.3.2.1]; [H&S, Sec. 5.4.1 p. 124, Sec. 7.4.1 pp. 186-7]。
脚注
... 弗吉尼亚7.1
这里有个美国典故, 在 1897 年, 有个叫 弗吉尼亚 (Virginia) 的八岁小女孩, 她对圣诞老人是否存在感到困惑, 因而写了封寻问信给《纽约太阳报》, 于是就有了 ``Yes, Virginia, there is a Santa Claus" 这篇评论, 有兴趣的朋友可以在 http://www.hymnsandcarolsofchristmas.com/santa/virginia's_question.htm 找到相关资料。
7.8 我遇到一些 ``搞笑" 的代码, 包含 5["abcdef"] 这样的 ``表达式"。 这为什么是合法的 C 表达式呢 ?
是的, 弗吉尼亚7.1, 数组和下标在 C 语言中可以互换。这个奇怪的事实来自数组 下标的指针定义, 即对于任何两个表达式 a 和 e, 只要其中一个是 指针表达式而另一个为整数, 则 a[e] 和 *((a)+(e)) 完全一样。这种交换性 在许多 C 语言的书中被看作值得骄傲的东西, 但是它除了在混乱 C 语言竞赛 之外, 其实鲜有用武之地。
参考资料: [Rationale, Sec. 3.3.2.1]; [H&S, Sec. 5.4.1 p. 124, Sec. 7.4.1 pp. 186-7]。
脚注
... 弗吉尼亚7.1
这里有个美国典故, 在 1897 年, 有个叫 弗吉尼亚 (Virginia) 的八岁小女孩, 她对圣诞老人是否存在感到困惑, 因而写了封寻问信给《纽约太阳报》, 于是就有了 ``Yes, Virginia, there is a Santa Claus" 这篇评论, 有兴趣的朋友可以在 http://www.hymnsandcarolsofchristmas.com/santa/virginia's_question.htm 找到相关资料。
#11
我的没崩溃,不过p[23]好让人揪心啊
#12
但是他又没有像数组那样事先给出数组的长度,那么这么使用会不会使内存混乱。
#13
我看到别人的代码里有这么用,因为不了解,所以也很揪心。
看了大家的回帖,这个用法可以理解为指针的位移?但是这么用对内存是安全的吗?
#14
表示学习了,不过p为NULL哎
#15
编译通过,说明语法没问题,但你这个程序存在很大的问题。