如何将数组的地址传递给函数?

3

我只是想问一下如何将数组的地址传递给函数。

void me( int *a ) {
    printf("%d\n", *a); // that gives me 11
}

int main () {
    int x[3]  = { 11, 12, 13 };

    me(&x[0]);

return 0;
}

但是如果我想传递整个数组,而不是重复使用 me(&x[//我想传递的位置]);

这种做法可行吗?


1
是的,这是可能的。你试过了吗?传递&x,甚至传递x会导致隐式转换('decay')为一个指针。因此,它和传递指向第一个元素的指针没有真正区别。如果函数可以传递不同的数组,或者每个数组的大小不固定,您还应该传递大小,这样您的函数就知道从第一个元素开始索引到哪里。 - underscore_d
1
&x[0] 等同于 x。它们是相同的,都是数组中第一个元素的地址。但在这里,你只使用了单个元素,所以不需要处理数组。 - Tim
如何获取一个变量的地址? 在这个变量前面加上 &。这个变量是什么?是 x。你有 C 语言的书或尝试过搜索教程吗?它们都会在早期解释这样的基本语言特性。 - underscore_d
4
@underscore_d x(或&x [0])与&x不同。前者是指向int的指针,而后者是指向int[3]的指针,这是非常大的区别。地址相同,但类型不同。 - Some programmer dude
1
明确声明一下:在C语言中不可能“传递一个数组”。我们所能做的只是通过执行me(x)(其中数组x会衰减为其第一个元素的地址)来传递其第一个元素的地址,或者通过执行me(&x)来传递数组的地址。后者仅在函数内部需要更改x的值时才是必要的,但对于OP的代码来说这是不可能的,因为x是一个数组变量。 - alk
显示剩余2条评论
6个回答

6

其他答案都很好,只有一件事需要从我的角度补充。

你应该向函数添加一个参数,以便能够将其与不同长度的不同数组一起使用,因此将数组的长度传递给 me 函数。

#include <stdio.h>

void me( int *a, size_t length ) {
    size_t i;
    for (i=0; i<length; i++)
       printf("Element %zu is %d\n", i, a[i]);
}

int main () {

    int x[3]  = { 11, 12, 13 };

    me(x, sizeof(x)/sizeof(x[0]));

    return 0;
}

您可以看到,我使用了sizeof来返回数组的字节长度。因此,将其除以数组中单个元素的字节大小。结果是数组的元素数量。


4

数组的地址与第一个元素的地址相同。要打印其余元素,只需像下面这样递增指针。

#include <stdio.h>

void me( int *a ) {
    printf("%d\n", *a); // that gives me 11
    printf("%d\n", *(a+1)); // will give you 12
    printf("%d\n", *(a+2)); // will give you 13
}

int main () {

    int x[3]  = { 11, 12, 13 };

    me(&x[0]);

return 0;
}

3

但你将“整个数组”传递给函数。通过传递指向第一个元素的指针,实际上也传递了指向其余元素的指针。

要打印出数组的第二个元素,请修改函数如下:

void me( int *a ) {
    printf("%d\n", a[1]); // prints the second element in a
}

这很有效,因为对于任何数组或指针a和索引i,表达式a[i]*(a + i)相同。
同时请注意,仅传递x与传递&x[0]相同,因为数组自然地衰减为其第一个元素的指针。所以调用可以简写为
me(x);  // Same as me(&x[0])

但是它给了我一个警告,说'me'的第一个参数传递了不兼容的指针类型.. - Display Name
@DisplayName 你确定吗?你用的编译器是什么? - LPs
1
@DisplayName 根据您展示的代码,不应该出现这样的警告。 - Some programmer dude

1
当您将数组名称传递给函数时,它会自动传递数组第一个元素的地址。因此,我们可以循环该地址并访问其他元素。您可以尝试一下。
#include<stdio.h>

void me( int *a) {
    int i;
    for(i=0;i<3;i++){
        printf("%d\n",*(a+i));
    }
}

int main () {

    int x[3]  = { 11, 12, 13 };

    me(x);

return 0;
}

输出

11
12
13

0

这对我有效。在这两个之间进行选择:

#include <stdio.h>

void me(int *a, int length) {
    int i = 0;
    while(i<length){
      printf("a[%d] = %d\n", i, a[i]);
      i++;
    }
}

int main() {
    int x[3]  = { 1, 2, 3, 4, 5 };
    me(x, sizeof(x)/sizeof(x[0]));

    return 0;
}

或者

#include <stdio.h>

void me(int *a, int length) {
    for (int i=0; i<length; i++)
      printf("a[%d] = %d\n", i, *(a+i));
}

int main() {
    int x[3]  = { 1, 2, 3, 4, 5 };
    me(x, sizeof(x)/sizeof(x[0]));

    return 0;
}

0

是的,您可以将整个数组传递给函数。因此,

 me(x); //Pass only name of array

数组保存元素起始地址,也就是 x[0] 的地址。

#include<stdio.h>

void me( int *a) {
    int i=0;
    while (i<3)
    {
        printf("%d\n",*(a+i));
        i++;
    }
}

int main () {

    int x[3]  = { 11, 12, 13 };

    me(x);

return 0;
}

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