指针后面直接带方括号,下标?数组?这是什么用法?

时间:2022-01-31 02:44:20

#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]关系一样。

#3


这段代码可以编译运行吗?我怎么运行不了

#4


p[23] = a1;<=> *(p+23)=a1;

#5


等价的

#6


跟数组一样,问题是你这确实能运行?

#7


不能运行。p被指向NULL,那里是不能存放东西的。

#8


指针数组

#9


首先 指针是可以这样用的 
其次 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 找到相关资料。

#11


我的没崩溃,不过p[23]好让人揪心啊

#12


引用 1 楼  的回复:
 这个很好理解:
Abc *p=NULL:指p指向类Abc,且给p初值为NULL(0);p[23]相当于p[0+23];其中[]中的数字为地址,计算方法等同于数组的下标计算一样;p[23]和p[99]联系就像数组a[1]与a[3]关系一样。


但是他又没有像数组那样事先给出数组的长度,那么这么使用会不会使内存混乱。

#13


引用 11 楼  的回复:
我的没崩溃,不过p[23]好让人揪心啊


我看到别人的代码里有这么用,因为不了解,所以也很揪心。
看了大家的回帖,这个用法可以理解为指针的位移?但是这么用对内存是安全的吗?

#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]关系一样。

#2


#3


这段代码可以编译运行吗?我怎么运行不了

#4


p[23] = a1;<=> *(p+23)=a1;

#5


等价的

#6


跟数组一样,问题是你这确实能运行?

#7


不能运行。p被指向NULL,那里是不能存放东西的。

#8


指针数组

#9


首先 指针是可以这样用的 
其次 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 找到相关资料。

#11


我的没崩溃,不过p[23]好让人揪心啊

#12


引用 1 楼  的回复:
 这个很好理解:
Abc *p=NULL:指p指向类Abc,且给p初值为NULL(0);p[23]相当于p[0+23];其中[]中的数字为地址,计算方法等同于数组的下标计算一样;p[23]和p[99]联系就像数组a[1]与a[3]关系一样。


但是他又没有像数组那样事先给出数组的长度,那么这么使用会不会使内存混乱。

#13


引用 11 楼  的回复:
我的没崩溃,不过p[23]好让人揪心啊


我看到别人的代码里有这么用,因为不了解,所以也很揪心。
看了大家的回帖,这个用法可以理解为指针的位移?但是这么用对内存是安全的吗?

#14


表示学习了,不过p为NULL哎

#15


编译通过,说明语法没问题,但你这个程序存在很大的问题。