对于许多问题,答案似乎可以在"标准"中找到.但是,我们在哪里找到它?最好是在线.
谷歌搜索有时会觉得徒劳,尤其是对于C标准,因为他们在编程论坛的大量讨论中被淹没.
要开始这个,因为这些是我现在正在搜索的,那里有很好的在线资源:
template<typename T, size_t n>
size_t array_size(const T (&)[n])
{
return n;
}
Run Code Online (Sandbox Code Playgroud)
我没有得到的部分是这个模板函数的参数.当我通过数组时,数组会发生什么,它给出n了数组中元素的数量?
int arr[] = { 3, 5, 9, 2, 8, 10, 11 };
int arrSize = *(&arr + 1) - arr;
std::cout << arrSize;
Run Code Online (Sandbox Code Playgroud)
我不知道这是如何工作的。所以任何人都可以帮助我解决这个问题。
假设我想获取大小未知的自动数组的最后一个元素.我知道我可以利用sizeof运算符来获取数组的大小并相应地获取最后一个元素.
使用*((*(&array + 1)) - 1)安全吗?
喜欢:
char array[SOME_SIZE] = { ... };
printf("Last element = %c", *((*(&array + 1)) - 1));
Run Code Online (Sandbox Code Playgroud)
int array[SOME_SIZE] = { ... };
printf("Last element = %d", *((*(&array + 1)) - 1));
Run Code Online (Sandbox Code Playgroud)
等等
我正在寻找一种方法来在C中找到数组的大小,而不使用sizeofC语言,我找到了以下代码:
int main ()
{
int arr[100];
printf ("%d\n", (&arr)[1] - arr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以请你解释一下它是如何工作的?
我不相信这是重复的(见下文)。†
我发现这个问题几乎是一个精确的重复,但是我认为答案无法分析漏洞。请参阅:*((*(&array + 1))-1)`是否可以安全地用于获取自动数组的最后一个元素?
我知道通常的方法是计算sizeof(array)/sizeof(*array)以获取数组中元素的数量。(并且在注释中已向我指出C ++具有std::size(array)。)
因此,我认为如果可以到达最后一个元素之后的地址,则可以使用指针数学运算来计算该数字。但是,后来我想到我可以:
&array + 1
Run Code Online (Sandbox Code Playgroud)
但是,此值的类型是指向数组的指针,因此要使数学正常工作,我需要取消引用此值。
const auto N = *(&array + 1) - array;
Run Code Online (Sandbox Code Playgroud)
在C和C ++中是否有允许这种取消引用合法的津贴?
我知道您可以指向数组最后一个元素之后的一个,但是您不能取消引用它。但是,此取消引用会产生一个数组对象,该对象立即衰减为指向其第一个元素的指针。
我可以使用a reinterpret_cast来避免使用取消引用运算符,但是我想知道在这种情况下C和/或C ++语言是否允许取消引用。
†我错过了类似的问题,但是这个问题有细微的不同。我已经了解了代码的工作原理,并且了解了将指针从数组的最后一个元素后移去通常存在问题。我要问的是,数组对象在表达式中使用时会衰减为指针的事实是否允许例外。我认为这可能是因为,取消引用指向对象的指针通常会导致对象值本身在表达式中使用(如果对象不存在,这将是一个问题)。
我是 C 初学者,有人要求我在不使用sizeof运算符的情况下计算数组的大小。所以我尝试了这段代码,但它只适用于奇数个元素。所有数组都像字符串一样以 NULL 结尾吗?
#include <stdio.h>
void main()
{
int a[] = {1,2,3,4,5,6,7,8,9};
int size = 0;
for (int i = 0; a[i] != '\0'; i++)
{
size++;
}
printf("size=%d\n", size);
}
Run Code Online (Sandbox Code Playgroud)