首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否可以在只有一个指针作为参数的函数中运行c数组?

是否可以在只有一个指针作为参数的函数中运行c数组?
EN

Stack Overflow用户
提问于 2019-04-15 00:35:43
回答 2查看 84关注 0票数 3

我正在尝试和学习C语言,创建了一个数组,并将它和它的大小一起传递给一个函数,这样我就可以遍历这个数组并打印它的所有元素(所以我给了这个函数两个参数:数组本身和它的大小)。

但现在,我只需将一个参数传递给函数即可完成所有这些操作。我通过使用指针让它工作了一点,但我不知道如何停止,因为我没有任何关于数组长度的信息,它只能在下面的代码中工作,因为我将数组长度放在for循环中。但是,如果我不知道大小,并且只向函数传递了一个参数,那么一般情况下如何工作呢?

我想,如果指针指向我当前使用的数组外部,可能会以某种方式实现,但这是可行的吗?

代码语言:javascript
复制
void printArray(int *p){
    for(int i=0; i<4; i++){
        printf("%d ", *(p+i));
    }
}

int main(){
    int myArray[4] = {8,4,1,1};
    int *p = myArray;
    printArray(p);
    return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-15 00:58:57

遍历没有长度参数的指向数组的唯一方法是,如果数组包含不同的终结器值。

例如,C字符串是char值的“NULL终止”数组。您可以遍历char*,因为您知道要测试'\0'字符是否存在,该字符的整数值为0。

由于它适用于您问题中的代码,因此您可以使用-1作为终止符,如下所示:

代码语言:javascript
复制
void printArray(int *p){
  while (*p != -1{
    printf("%d ", *p++);
  }
}

但是,请注意,这样做需要有某种方法将有效的int值解释为“无效”。

大体上,只将数组的长度传递给函数要容易得多。

票数 3
EN

Stack Overflow用户

发布于 2019-04-15 01:18:04

除了前面提到的其他方法之外,我还可以提供另外两种方法:

1)可以将数组的长度作为第一个元素传递(就像Pascal中的一些容器一样):

代码语言:javascript
复制
#include <stdio.h>

void print_array(int *arr)
{
    int length = arr[0];
    for (int index = 1; index <= length; ++index)
        printf("%d ", arr[index]);
    printf("\n");
}

int main()
{
    int length = 10;
    int *arr = malloc(sizeof(int) * length);
    arr[0] = length;
    for (int index = 1; index <= length; ++index)
        arr[index] = index * index * index;
    print_array(arr);
    free(arr);
    return 0;
}

2)您可以为您的阵列创建一个struct (就像在使用class的C++ STD中为std::vector创建一样):

代码语言:javascript
复制
#include <stdio.h>

typedef struct Array
{
    int size;
    int *data;
} Array;

void print_array(Array *arr)
{
    for (int index = 0; index < arr->size; ++index)
        printf("%d ", arr->data[index]);
    printf("\n");
}

int main()
{
    int length = 10;
    Array *arr = malloc(sizeof(Array));
    arr->data = malloc(sizeof(int) * length);
    arr->size = length;
    for (int index = 0; index < length; ++index)
        arr->data[index] = index * index * index;
    print_array(arr);
    free(arr->data);
    free(arr);
    return 0;
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55677594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档