如何在C语言中增加数组

3

我正在尝试使用变量作为增量来递增一个整数数组,但是它会抛出错误。

int array[MAXSIZE];
int n;

//fill the array with some numbers
//some other code

这里的情况是,一旦我分析了前面的“n”个数字,就不再需要它们了,从起始位置迭代数组将浪费循环次数,因此我想通过“n”来增加数组。 注意:由于我正在处理的问题类型,我不能仅仅保存变量的位置并稍后使用array[position]从该位置开始;我必须永久地增加指针。
array += n;

并且会抛出这个错误:赋值时类型不兼容。
我事先不知道“n”会是多少。我尝试使用array += sizeof(int)*n;但它也失败了。


4
数组不是指针。 - undefined
7
创建一个指针并使用它:int* p_toArray = array; - undefined
3
数组不是指针。你不能对数组进行递增操作(但你可以对指针进行递增操作)。 - undefined
@AndrewHenle:p_toArray++;这段代码会让人们期望它做什么,但实际上并没有做到的呢? - undefined
1
@Ryan 如果有人期望 p_toArray++; 做某事,但实际上它并没有做到什么? 也许是指向数组的下一个元素,而不是数组结束后的地址?或者根据上下文而定,可能是相反的情况。 - undefined
显示剩余7条评论
5个回答

2

int array[MAXSIZE]; array是一个数组而不是指针。你不能递增一个数组变量。你可以这样做:

int *p = array;
p += whatever;

请确保在指向数组的最后一个元素之外的任何元素时,不要引用p

打印arrayp的输出(地址)相同,并不意味着它们是相同的东西。


我以为数组和指针是一样的哈哈。然而在我的代码中,我经常使用array[x]这种语法。如果按照你说的做,我可以用p[x]吗? - undefined
@Ric 是的,你可以 :) - undefined
当然可以,再次确保x在适当的范围内。 - undefined

0
数组名是一个`type * const array_name`,所以你不能移动它(注意它是一个常量指针)。 你可以自己定义一个指针然后移动它。例如:
int *arr = new int[siz];

或者在C语言中:

int *arr = (int *)malloc(n * sizeof(int));

如果您的源代码是在一个 .c 文件中,您不需要进行类型转换。


你有注意到这个语言吗? - undefined
即使在 C++ 中,int *arr = new int[siz]; 通常是相当糟糕的写法。 - undefined

0
根据C语言标准(6.3.2.1 Lvalues、数组和函数设计符):
除非它是sizeof运算符或一元&运算符的操作数,或者它是用于初始化数组的字符串字面量,否则具有“数组类型”的表达式将被转换为具有“指向类型”的表达式,该表达式指向数组对象的初始元素并且不是lvalue。如果数组对象具有寄存器存储类,行为未定义。
因此,您不能以这样的方式更改数组
array += n;

所以只需再使用一个类型为int *的变量。例如
int array[MAXSIZE];
int n;

//...

int *p = array;

p += n;

0
#include<stdio.h>
#include<stdlib.h>
#define MAX 100

int main()
{

    int array*,i,n;

    printf("Enter size of array:\n");
    scanf("%d",&n);

    array = malloc(n*sizeof(int));

    /* code to enter numbers in array */

    array += n;

    //remember to free pointers after you are done with them

    free(array);

    return 0;
}

这应该可以了。


...且缩进不规范。而且#DEFINE应该使用小写。 - undefined
请问能否解释一下内存泄漏的原因?我愿意改进。 - undefined
使用malloc分配内存,然后丢失原始指针,导致无法在之后释放它(请注意,此代码并不打算这样做...) - undefined
你的意思是在指针被使用后要使用free()函数释放它吗?我以为楼主会知道如何做。 - undefined
使用malloc分配内存只是增加了不必要的复杂度层次,有些人可能会认为这是必要的。 - undefined

0
如果你想要用数据填充数组,那么你需要通过索引来访问数组。
int array[MAXSIZE];
int i;

for (i = 0; i < MAXSIZE; i++) {
    array[i] = rand();
}

如果你真的想要使用指针,并进行“指针算术”,那么你必须小心谨慎。
int array[MAXSIZE];
int *p;
int i;

p = &(array[0]);
for (i = 0; i < MAXSIZE; i++) {
    *p = rand();
    p += 1;
}

指针算术可能不会按照你的期望工作...执行 p += 1 并不会将指针移动一个字节,甚至一个 int,而是会按照变量所引用类型的大小来移动地址。
进行一个实验:
#include <stdio.h>

void main(void) {
    struct info {
        int a;
        int b;
    };

    struct info array[10];
    struct info *p;
    int n;

    p = &(array[0]);

    printf("sizeof(*p): %zu\n", sizeof(*p));

    for (n = 0; n < 10; n++) {
        printf("address: %p\n", p);
        p += 1;
    }
}

这将使得循环每次执行时,p的值增加sizeof(*p)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接