这是我第一次这么问,请温柔哈哈。 所以我试图更好地理解C中的数组。有没有一种方法可以在不使用for循环的情况下向数组添加元素?问题是我想在数组的末尾添加一个新元素,但不知道数组的大小。
所以我已经有了这个:
#include <stdlib.h> //not sure if needed but put it just in case
int main(void):
float real[20];
real[]={1,2,3,4,5};
我想在数组中添加数字6,但我不想使用real [5] = 6。是否有另一种方法将元素添加到数组的末尾而没有循环检查数组中的每个元素是否为null?感谢您的帮助!
答案 0 :(得分:2)
C阵列不知道它们的长度。如果您需要可以增长和缩小的阵列,则必须保留有关活动阵列的详细信息。在堆栈上创建的数组如下:
real array[20] = {1, 2, 3};
将包含20个元素,前三个元素用具体值初始化,其余元素初始化为零。如果要将此数组视为最初包含最多20个值的三个值的数组,则必须将实际数组长度保留为额外变量:
real array[20] = {1, 2, 3};
int narray = 3;
然后您可以追加一个值。注意不要超过20个元素的最大存储空间:
if (narray < 20) array[narray++] = 9;
您可以读取最后一个值并将其从数组中删除:
if (narray) printf("%g\n", array[--narry]);
在这里,您必须注意不要使阵列下溢。 (另外,不要在同一个表达式中多次递减narray
,这将导致未定义的行为。)
如果编写一个对数组进行操作的函数,则传递数组和长度:
void array_print(float array[], int n)
{
int i;
for (i = 0; i < n; i++) {
if (i) printf(", ");
printf("%g", array[i]);
}
printf("\n");
}
并称之为:
array_print(array, narray);
另一种方法是保留像0.0
这样的标记值。这在某些情况下很有用,但它的缺点是你必须遍历整个数组以找出长度。它还会从数组可以容纳的有效值范围中删除标记。
这里的优点当然是阵列是自包含的,即你不必将数组和长度传递给函数;只是阵列就够了。在追加时你还是要注意不要超过最大存储量,这使得这种方法很麻烦。
答案 1 :(得分:1)
唯一的方法是保持指向数组中下一个空闲位置的指针。例如
#include <stdio.h>
float * copy( const float *src, size_t n, float *dst )
{
while ( n-- ) *dst++ = *src++;
return dst;
}
int main(void)
{
float real[20];
float *p = real;
p = copy( ( float [] ){ 1, 2, 3, 4, 5 }, 5, p );
p = copy( ( float [] ){ 6, 7 }, 2, p );
for ( float *q = real; q != p; ++q ) printf( "%1.1f ", *q );
printf( "\n" );
return 0;
}
输出
1.0 2.0 3.0 4.0 5.0 6.0 7.0
您始终可以使用条件
检查数组中是否p
点
p < real + 20
另一种方法是使用包含数组的结构。例如
struct Array
{
enum { N = 20 };
float real[N];
size_t n; /* current number of filled elements */
};
答案 2 :(得分:0)
在预处理器的帮助下,您可以使用复合文字来获得大小:
int main(void)
{
#define REAL_VALUES 1, 2, 3, 4, 5
float real[20] = {REAL_VALUES};
real[sizeof((float[]){REAL_VALUES}) / sizeof(float)] = 6;
return 0;
}
答案 3 :(得分:0)
在C中,你可以通过定义一个宏来获得表达式为sizeof (array) / sizeof (array)[0]
的数组的长度,甚至更好:
#define LEN(array) \
((int) (sizeof (array) / sizeof (array)[0]))
您所描述的不是在数组末尾添加元素,而是在插入最后一个元素后添加元素。为此,您需要一个跟踪元素数量的变量:
int count = 0;
float x;
...
if (count < LEN(real)) {
real[count] = x;
count++;
}
但是,请注意,一旦将数组传递给函数,它的长度就会消失,所以你需要将数组长度传递给函数:
void foo(float a[], int len);
...
foo(real, LEN(real));
答案 4 :(得分:0)
您可以使用memset()
在数组中为元素留出空间,然后将元素插入特定位置。
这是下面的示例代码。
/*Make space for number to insert.*/
memmove(&arr[pos+1],&arr[pos],(ARR_SIZE+1-pos)*sizeof(int));
arr[pos] = num;/*insert the number.*/
完整的代码段可以在InsertElement中找到