Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中循环使用没有索引的数组?_C_Arrays_Pointers - Fatal编程技术网

如何在C中循环使用没有索引的数组?

如何在C中循环使用没有索引的数组?,c,arrays,pointers,C,Arrays,Pointers,我需要分配一个N大小的数组并给它赋值,没有int索引我怎么做 以下是我目前掌握的代码,但它不能满足我的需要: #include <stdlib.h> #include <stdio.h> int main() { int *array; int n; printf("Size of array: "); scanf("%d", &n); array = (int*) malloc(n*sizeof(int));

我需要分配一个N大小的数组并给它赋值,没有int索引我怎么做

以下是我目前掌握的代码,但它不能满足我的需要:

#include <stdlib.h>
#include <stdio.h>

int main() {
    int *array;
    int n;

    printf("Size of array: ");
    scanf("%d", &n);
    array = (int*) malloc(n*sizeof(int));
    if (array == NULL) printf("Memory Fail");

    for(; *array; array++)
    {
        printf("Store:\n");
        scanf("%d", &n);
        *array = n;
    }

    for(; *array; array++)
    {
        printf("Print: %d\n",*array);
    }

    free(array);
    return 0;
}
#包括
#包括
int main(){
int*数组;
int n;
printf(“数组大小:”);
scanf(“%d”和“&n”);
数组=(int*)malloc(n*sizeof(int));
如果(数组==NULL)printf(“内存失败”);
对于(;*array;array++)
{
printf(“存储:\n”);
scanf(“%d”和“&n”);
*数组=n;
}
对于(;*array;array++)
{
printf(“打印:%d\n”,*数组);
}
自由(数组);
返回0;
}

如果你有一个数组
int*a,谢谢你然后:

a[0] is equal to *a
a[1] is equal to *(a+1)
a[2] is equal to *(a+2)

因此,您可以通过对指针执行算术来遍历数组。

如果您有一个数组
int*a然后:

a[0] is equal to *a
a[1] is equal to *(a+1)
a[2] is equal to *(a+2)

因此,您可以通过在指针上执行算术来遍历数组。

您正在使用
*array
作为条件,这意味着
for
循环应该继续,除非
*array
的计算结果为false,这仅当
*array==0
时。实际上,您正在调用未定义的行为,因为您使用
malloc
分配
array
,并且在底层数据可能是任何数据时尝试取消对指针的引用,因为数据块已被取消初始化

您仍然需要某种类型的计数器进行循环,在本例中,您分配了
n

/* I'm using a C99 construct by declaring variables in the for initializer */
for (int i = 0; i < n; ++i)
{
    /* In your original code you re-assign your counter 'n', don't do that otherwise you lost the size of your array! */
    int temp; 
    printf("Store: \n");
    scanf("%d", &temp)
    array[i] = temp;
}

/* This is your second loop which prints the items */
for (int i = 0; i < n; ++i)
{
    printf("%d\n", array[i]);
}
/*我通过在for初始值设定项中声明变量来使用C99构造*/
对于(int i=0;i

另外,如果不保留
数组
指针的副本,请不要操作该指针只能对
malloc
返回的指针执行
free


使用索引与操纵指针是一样的,否则你的教授就太可笑了。

你使用的是
*array
作为条件,这意味着
for
循环应该继续,除非
*array
的计算结果为false,这仅当
*array==0
时。实际上,您正在调用未定义的行为,因为您使用
malloc
分配
array
,并且在底层数据可能是任何数据时尝试取消对指针的引用,因为数据块已被取消初始化

您仍然需要某种类型的计数器进行循环,在本例中,您分配了
n

/* I'm using a C99 construct by declaring variables in the for initializer */
for (int i = 0; i < n; ++i)
{
    /* In your original code you re-assign your counter 'n', don't do that otherwise you lost the size of your array! */
    int temp; 
    printf("Store: \n");
    scanf("%d", &temp)
    array[i] = temp;
}

/* This is your second loop which prints the items */
for (int i = 0; i < n; ++i)
{
    printf("%d\n", array[i]);
}
/*我通过在for初始值设定项中声明变量来使用C99构造*/
对于(int i=0;i

另外,如果不保留
数组
指针的副本,请不要操作该指针只能对
malloc
返回的指针执行
free


使用索引与操作指针是一样的,否则你的教授就太可笑了。

当你分配内存时,你无法在内存中确定它的结束位置(除非你决定一个约定并在某个地方设置一个值,但无论如何你都会使用n)。

在您的情况下,您必须使用n来限制阵列覆盖范围(否则它只受您的计算机容量限制,直到它到达无法访问的区域:程序崩溃)。例如(注意不要覆盖n!)


当您分配内存时,您无法在内存中确定它的结束位置(除非您决定一个约定并在某个地方设置一个值,但无论如何您都会使用n)。

在您的情况下,您必须使用n来限制阵列覆盖范围(否则它只受您的计算机容量限制,直到它到达无法访问的区域:程序崩溃)。例如(注意不要覆盖n!)

  • (;*array;array++)的
    您应该删除
    在末尾
  • 此循环的迭代次数未定义,您将丢失一个指针
  • 你应该这样做:

    int *cur;
    for(cur = array; cur < array+n; ++cur)
    {
        *cur = ...;
    }
    
    int*cur;
    for(cur=数组;cur
  • (;*array;array++)的
    您应该删除
    在末尾
  • 此循环的迭代次数未定义,您将丢失一个指针
  • 你应该这样做:

    int *cur;
    for(cur = array; cur < array+n; ++cur)
    {
        *cur = ...;
    }
    
    int*cur;
    for(cur=数组;cur
    我不确定我是否理解“没有int索引”?你究竟为什么会受到这种限制?您是否“允许”使用指针算术?(即,*(数组+1);?)指针算法将是一种可行的方法。但这与索引完全相同(
    *(arr+2)
    arr[2]
    )这是家庭作业问题的一部分,而不是整个家庭作业,限制只是因为教授希望我们尽可能优化(是的,我知道这有点过头了)。除非你使用老师编写的编译器,使用索引或指针将产生完全相同的代码。另外,需要考虑的是:如果您知道n,您从一开始就知道,最后一个有效指针值应该是什么。。。现在做你的家庭作业…我不确定我是否理解“没有int索引”?你究竟为什么会受到这种限制?您是否“允许”使用指针算术?(即,*(数组+1);?)指针算法将是一种可行的方法。但这完全是错误的