C没有elementsof
关键字来获取数组的元素数。
所以这通常被计算sizeof(Array)/sizeof(Array[0])
所取代
但这需要重复数组变量名称。
1[&Array]
是指向数组后面的第一个元素的指针,所以
你可以使用:
int myArray[12] = {1,2,3};
int *pElement;
for (pElement = myArray; pElement < 1[&myArray]; pElement++)
{
...
}
替换:
for (pElement = myArray; pElement < &myArray[sizeof(myArray)/sizeof(myArray[0])]; pElement++)
{
...
}
你认为这太混淆了吗?
答案 0 :(得分:5)
(myvenv) C:\Users\Julcsi\djangogirls> python manage.py migrate
Traceback (most recent call last):
File "manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "C:\Users\Julcsi\djangogirls\myvenv\lib\site-packages\django\core\management\__init__.py",
line 364, in execute_from_command_line
utility.execute()
File "C:\Users\Julcsi\djangogirls\myvenv\lib\site-packages\django\core\management\__init__.py",
line 338, in execute
django.setup()
File "C:\Users\Julcsi\djangogirls\myvenv\lib\site-packages\django\__init__.py",
line 27, in setup
apps.populate(settings.INSTALLED_APPS)
File "C:\Users\Julcsi\djangogirls\myvenv\lib\site-packages\django\apps\registry.py",
line 85, in populate
app_config = AppConfig.create(entry)
File "C:\Users\Julcsi\djangogirls\myvenv\lib\site-packages\django\apps\config.py",
line 94, in create
module = import_module(entry)
File "C:\Users\Julcsi\AppData\Local\Programs\Python\Python37\lib\importlib\__init__.py",
line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 723, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_remove
File "C:\Users\Julcsi\djangogirls\myvenv\lib\site-packages\django\contrib\admin\__init__.py",
line 4, in <module>
from django.contrib.admin.filters import (
File "C:\Users\Julcsi\djangogirls\myvenv\lib\site-packages\django\contrib\admin\filters.py",
line 10, in <module>
from django.contrib.admin.options import IncorrectLookupParameters
File "C:\Users\Julcsi\djangogirls\myvenv\lib\site-packages\django\contrib\admin\options.py",
line 12, in <module>
from django.contrib.admin import helpers, widgets
File "C:\Users\Julcsi\djangogirls\myvenv\lib\site-packages\django\contrib\admin\widgets.py",
line 152
'%s=%s' % (k, v) for k, v in params.items(),
SyntaxError: Generator expression must be parenthesized
不明显。我建议你使用临时变量:
1[&myArray]
或者只是使用标准索引变量:
size_t count = sizeof array / sizeof *array;
int * const end = &array[count];
for (pElement = myArray; pElement < end; pElement++)
你做什么,使用临时变量,因为你可以描述性地命名它们。它将使代码读取速度更快,而不会影响运行时性能(除非编译器是脑死亡)。
答案 1 :(得分:4)
&myarray
的类型为int(*)[12]
,因此当您编写1[&myarray]
时,它等同于*((&myarray)+1)
,它指向的元素位于最后一个元素之后数组myarray
。 它是合法的,因为我们可以比较指向相同数组元素的指针或超过数组最后一个元素的指针(假设它们属于同一类型)。
请注意,我不会说您将int*
分配给int(*)[]
,因为编辑器会抱怨丢失类型信息。
*(&myarray+1)
- &myarray
的类型为int(*)[12]
。 &myarray+1
是最后一个元素之后的一个。取消引用它我们获得相同的值,但是在将它衰减到指向第一个元素的指针({1}}并指向数组的最后一个元素时,它是int[12]
的不同类型。
答案 2 :(得分:1)
虽然这个建议可能有用,但它与惯用的C相差甚远,因此可能会使您的代码难以维护。
就个人而言,我坚持使用传统的ARRAY_SIZE
宏:
#define ARRAY_SIZE(a) (sizeof (a) / sizeof (a)[0])
然后将其用作
for (p = array; p < array + ARRAY_SIZE(array); ++p)
答案 3 :(得分:1)
正式和迂腐地,1[&array]
方法无效。它会导致未定义的行为。
表达式相当于
(implicit array-to-pointer conversion) *(&array + 1)
此表达式包含一元*
运算符的应用程序,该指针指向一个&#34;虚构的&#34; int [12]
类型的过去对象。 *
的此应用程序正式评估,并且,根据6.5.6 / 8,产生未定义的行为
如果结果指向一个超过数组对象的最后一个元素的那个,那么 不得用作被评估的一元
*
运算符的操作数。
另一方面,情况与我们在C89 / 90中遇到的问题非常相似,其中a + 12
是形成过去指针的有效方式,同时{ {1}}被视为未定义。 &a[12]
等同于&a[12]
,它也会将&*(a + 12)
应用于过去的指针,从而导致未定义的行为。
C99通过在6.5.3.2/3中声明*
组合应该基本上&#34;消失&#34;来使&a[12]
方法合法化。从表达式开始,意味着未评估&*
并且未触发未定义的行为
同样,如果操作数是
*
运算符的结果,则[]
运算符和&
隐含的一元*
都不会被评估,结果就像移除了[]
运算符并将&
运算符更改为[]
运算符一样。
我们的情况
+
在本质上非常相似。如果语言标准说在上面的上下文中数组到指针转换和一元(implicit array-to-pointer conversion) *(&array + 1)
运算符应该&#34;部分地消灭&#34;那将是有意义的。彼此,只留下一个简单的隐式*
演员。但唉,语言规范中的情况并非如此。