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

C 如何将数组的地址传递给函数?,c,arrays,pointers,C,Arrays,Pointers,我只是想问一下如何将数组的地址传递给函数 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[//我想通过的位置)来通过整个数组,该怎么办 可能吗?但是您正在将“整个数组”传递给函数。通过传递指向第一个元素的指针,实际上也在

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

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[//我想通过的位置)来通过整个数组,该怎么办

可能吗?

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

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

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])

数组的地址与第一个元素的地址相同。要打印其余元素,只需按如下所示递增指针

#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;
}
#包括
使我无效(int*a){
printf(“%d\n”,*a);//这给了我11
printf(“%d\n”,*(a+1));//将给您12
printf(“%d\n”,*(a+2));//将给您13
}
int main(){
int x[3]={11,12,13};
me(&x[0]);
返回0;
}

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

 me(x); //Pass only name of array
数组保存元素的起始地址意味着
x[0]
address

#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;
}
#包括
使我无效(int*a){
int i=0;

而(i当您将数组名传递给函数时,它将自动传递数组第一个元素的地址。因此,我们可以循环该地址并访问其他元素。您可以尝试此操作

#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;
}

所有其他答案都很好,只是需要补充一点,从我的观点来看

您应该向函数中添加一个参数,以便能够在不同长度的数组中使用它,因此将数组的长度传递给
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;
}
#包括
无效me(整数*a,大小\u t长度){
尺寸i;

对于(i=0;iYes,这是可能的。您尝试过吗?传递
&x
,或者甚至传递
x
都会导致隐式转换(“衰减”)指向指针。因此,它与向第一个元素传递指针没有什么区别。如果函数可以传递不同的数组,或者每个数组的大小不固定,则也应该传递大小,以便函数知道它可以从第一个元素索引多远。&x[0]相当于x。它是相同的,数组中第一个元素的地址。但是这里你只使用一个元素,所以你不需要处理数组。你能根据我的问题给我一个例子吗only@underscore_d
x
(或
&x[0]
)与
&x
不同。第一个是指向
int
的指针,另一个是指向
int[3]
的指针,差别很大。地址相同,但类型不同。要明确说明这一点:在C中不可能“传递数组”。只需执行
me(x)即可传递其第一个元素的地址
(其中数组
x
衰减其第一个元素的地址)或通过执行
me(&x)传递数组的地址
。只有在函数内部更改
x
的值时,才需要后者,这对于OP的代码是不可能的,因为
x
是一个数组变量。但它给我一个警告,即从不兼容的指针类型传递“me”的arg 1。@DisplayName是否确定?您的编译器是什么?@DisplayName代码,如y所示你展示了它,不应该引起这样的警告。
#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;
}