본문 바로가기
Arduino

스케치 함수 인자 처리 결과 값 전달

by noruen 2021. 11. 4.

&

앰퍼샌드 ampersand 연산자 & - x 가 변수 이면 &x 는 x 의 주소를 가리키는 포인터 pointer 이다.

 

*

포인터 선언 또는 포인터가 가리키는 변수의 값.

 

[ ]

// 배열 선언
int anArray [];

 

예제

int *p; // int 자료형에 대한 포인터 선언 
int i = 5;  // int 변수에 5 를 할당
int result = 0; 

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println("Test begin");
  
  p = &i;  // 'p' 'i' 의 주소를 가짐. 즉, p 는 i 의 주소를 가리키는 포인터 
  result = *p;  // *p 는 주소의 값을 가짐. 즉, *p 는 i 의 값

  Serial.print("i = "); 
  Serial.println(i);
  //Serial.print("p = ");
  //Serial.println(p);  // -> 에러: no matching function for call to 'println(int*&)'
  Serial.print("result = ");
  Serial.println(result);  
}

void loop() {
  // put your main code here, to run repeatedly:

}

출력

Test begin
i = 5
result = 5

 

함수를 통한 배열 변수 전달

 

/* 참고: https://www.tutorialspoint.com/arduino/arduino_passing_arrays_to_functions.htm
 * 그대로 하면 동작 안함. 
 * 일부 변형해서 성공함.
 */
// 원래 modifyArray( int [], int ) -> 되고, 
// 변형 modifyArray( int *[], int ) -> 되고,
// 변형 modifyArray( int &[], int ) -> 안된다. 
// 변형 modifyArray( int a[], int sizeOfArray ) -> 변수명을 넣어도 된다. 
// 변형 modifyArray( int *a[], int sizeOfArray ) -> 변수명을 넣어도 된다. 
void modifyArray( int *a[], int sizeOfArray ); 
// void modifyArray( int a[], int sizeOfArray ); 

// 원래는 modifyElement( int ); -> 안되고
// 변형하여 modifyElement( int & ); -> 된다.
// 변형하여 modifyElement( int * ); -> 된다.
// 변형하여 modifyElement( int &e ); -> 변수명을 넣어도 된다. 
void modifyElement( int &e );

// 내가 새로 만들어 본 함수
void modifyDifferentTypeVariables( unsigned long &, unsigned long &, long & ); 

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println("Test passing an array by reference ");
  
  const int arraySize = 5;
  int a[ arraySize ] = {0, 1, 2, 3, 4};
  
  Serial.println("Oriinal array "); 
  for (int i = 0; i < arraySize; ++i) {
    Serial.println(a[i]);  
  }
  
  modifyArray(a, 5);
  
  Serial.println("modified array ");
  for (int j = 0; j < arraySize; ++j) {
    Serial.println(a[j]); 
  }

  Serial.println("original element ");
  Serial.println(a[4]);
  
  modifyElement(a[4]); 
  
  Serial.println("modified element ");
  Serial.println(a[4]);

  // 내가 넣은 스크립트
  unsigned long D = 10;
  unsigned long E = 10;
  long F = 10; 
  Serial.println("before "); 
  Serial.println(D);
  Serial.println(E);
  Serial.println(F);
  modifyDifferentTypeVariables(D, E, F); 
  Serial.println("after "); 
  Serial.println(D);
  Serial.println(E);
  Serial.println(F);

}

void loop() {
  // put your main code here, to run repeatedly:
  
}

void modifyArray( int a[], int sizeOfArray ) {
  for (int k = 0; k < sizeOfArray; ++k) {
    a[k] *= 2; 
  }
}

// 원래는 modifyElement( int e ) {..} -> 원소 변경안되고 그대로 출력
// 변형해서 modifyElement( int *e ) {..} -> 안된다. 처음 선언떄는 *e 도 된다. 함수 정의에서 안된다.
// 변형해서 modifyElement( int &e ) {..} -> 원소 변경되어 제대로 출력
void modifyElement( int &e ) {
  e *= 100; 
}


// 내가 새로 만들어 본 함수
void modifyDifferentTypeVariables( unsigned long &A, unsigned long &B, long &C) {
  A += 1; 
  B *= 2;
  C *= 10; 
}

 

반응형

댓글