1 [& array]是& array [sizeof(array)/ sizeof(array [0])]的正确替代品还是太混淆了?

时间:2018-02-16 08:02:26

标签: c arrays

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++)
{
  ...
}
你认为这太混淆了吗?

4 个答案:

答案 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;那将是有意义的。彼此,只留下一个简单的隐式*演员。但唉,语言规范中的情况并非如此。