我只是想问一下如何将数组的地址传递给函数。
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[//我想传递的位置]);
这种做法可行吗?
其他答案都很好,只有一件事需要从我的角度补充。
你应该向函数添加一个参数,以便能够将其与不同长度的不同数组一起使用,因此将数组的长度传递给 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来返回数组的字节长度。因此,将其除以数组中单个元素的字节大小。结果是数组的元素数量。
数组的地址与第一个元素的地址相同。要打印其余元素,只需像下面这样递增指针。
#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;
}
但你将“整个数组”传递给函数。通过传递指向第一个元素的指针,实际上也传递了指向其余元素的指针。
要打印出数组的第二个元素,请修改函数如下:
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) {
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
这对我有效。在这两个之间进行选择:
#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;
}
是的,您可以将整个数组传递给函数。因此,
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;
}
&x
,甚至传递x
会导致隐式转换('decay')为一个指针。因此,它和传递指向第一个元素的指针没有真正区别。如果函数可以传递不同的数组,或者每个数组的大小不固定,您还应该传递大小,这样您的函数就知道从第一个元素开始索引到哪里。 - underscore_d&
。这个变量是什么?是x
。你有 C 语言的书或尝试过搜索教程吗?它们都会在早期解释这样的基本语言特性。 - underscore_dx
(或&x [0]
)与&x
不同。前者是指向int
的指针,而后者是指向int[3]
的指针,这是非常大的区别。地址相同,但类型不同。 - Some programmer dudeme(x)
(其中数组x
会衰减为其第一个元素的地址)来传递其第一个元素的地址,或者通过执行me(&x)
来传递数组的地址。后者仅在函数内部需要更改x
的值时才是必要的,但对于OP的代码来说这是不可能的,因为x
是一个数组变量。 - alk