int arrays[2] = {0,1};
void setup () {
Serial.begin(9600);
pinMode(2,INPUT);
}
void loop () {
int buttonstate = digitalRead(2); //reads I/O pin 2
if (buttonstate==HIGH) { //if I/O pin 2 is HIGH do following
arrays[] = function(arrays); //calls function "function"
Serial.println(arrays[0]); //prints out arrays[0]
Serial.println(arrays[1]); //prints out arrays[1]
}
}
int function (int arrays [2]) {
int holder = arrays[1]; //switches place the values on the array
arrays[1] = arrays[0];
arrays[0] = holder;
return arrays[]; //return the modified array
}
我在这里做错了什么?有人可以解释为什么我的代码错了吗? 为什么它不返回数组并修改其内容?我已阅读其他关于指针的文章,但我无法理解它们是如何工作的。
答案 0 :(得分:1)
好吧,你最糟糕的误解是认为C允许你传递一个完整的数组作为参数或返回值。
首先,你不能做像
这样的作业arrays[] = function(...);
这是不正确的,因为无法将数组作为一个整体引用。您可以返回对数组的引用,例如:
arrays = function(...);
始终您的函数会返回有效的 POINTER TO INTEGER ,并始终将您的arrays
变量声明为int *arrays;
。但这有另一个问题......指针不会为指向的值分配内存。
最好的解决方案是使用数组引用将其传递给函数,然后使函数在数组上运行。喜欢
function(arrays); /* you should have function exchanged the arrays values properly */
for (i = 0; i < 2; i++) /* print arrays contents and check values have been exchanged */
printf("arrays[%d] == %d\n", i, arrays[i]);
在这种情况下,arrays()
函数应该已经实现为
void function(int arrays[])
{
int temporary = arrays[0];
arrays[0] = arrays[1];
arrays[1] = temporary;
/* no return as function is declared void */
}
当然,您可以返回对原始数组的引用,这在某些表达式中会有所帮助,但请始终认为您正在处理相同的数组。
int *function(int *arrays) /* this parameter declaration is equivalent to the last one */
{
int temporary = arrays[0];
arrays[0] = arrays[1];
arrays[1] = temporary;
return arrays; /* reference to the first array element */
}
答案 1 :(得分:0)
数组通过引用传递给函数 如果在函数中修改数组,则在函数调用后更改将保持不变。
int arrays[2] = {0, 1};
void setup() {
Serial.begin(9600);
pinMode(2, INPUT);
}
void loop() {
int buttonstate = digitalRead(2); //reads I/O pin 2
if (buttonstate == HIGH) { //if I/O pin 2 is HIGH do following
function(arrays); //calls function "function"
Serial.println(arrays[0]); //prints out arrays[0]
Serial.println(arrays[1]); //prints out arrays[1]
}
}
void function(int arrays[]) {
int holder = arrays[1]; //switches place the values on the array
arrays[1] = arrays[0];
arrays[0] = holder;
}
如果您不想修改现有阵列,则需要传递另一个阵列。
int arrays[2] = {0, 1};
int arrays2[3];
void setup() {
Serial.begin(9600);
pinMode(2, INPUT);
}
void loop() {
int buttonstate = digitalRead(2); //reads I/O pin 2
if (buttonstate == HIGH) { //if I/O pin 2 is HIGH do following
function(arrays, arrays2); //calls function "function"
Serial.println(arrays2[0]); //prints out arrays2[0]
Serial.println(arrays2[1]); //prints out arrays2[1]
Serial.println(arrays2[2]); //prints out arrays2[2]
}
}
void function(int arrays[], int arrays_return[]) {
arrays_return[0] = arrays[1];
arrays_return[1] = arrays[0];
arrays_return[2] = arrays[0] + arrays[1];
}
您需要确保数组具有适当的大小,因为如果您在数组的范围之外写入/读取,则不会抛出任何显式错误,但您可能会发现一些难以调试的奇怪行为。