학교 수업/임베디드 시스템

[임베디드 시스템] 3. 포인터와 구조체

흑요석s 2022. 10. 13. 22:59
  • 포인터 변수 (포인터)

주소 값(포인터)를 저장할 수 있는 변수로 다른 메모리 공간을 카르킨다.

 

  • 포인터 변수 선언
#include <stdio.h>

int main()
{
	int *p = NULL;  // int* p == int * p 모두 같음(포인터생성)
	int num = 15; // num의 값은 15

	p = &num;	//포인터p = num의 주소

	printf("int 변수 num의 주소 : %d \n", &num);
	printf("포인터 p의 값 : %d \n", p);
	printf("포인터 p가 가리키는 값 : %d \n", *p);
	
    //num과 *p는 동일하게 사용되어 짐을 알 수 있다.
    
	return 0;
}

- 예제 코드와 결과값

 

  • 포인터와 연산자의 우선순위

- 이상한 값을 가르키는 *p++(출처 : 구름edu)

- (*p)++ 은 괄호가 있는 참조 연산자(*)를 우선적으로 수행 후 증감연산자(++)를 수행한다.

- *p++ 는  p라는 주소값을 늘리는 것을 먼저 수행하므로 아무것도 없는 주소p 로 바뀌기 때문에 이상한 값이 나옴.

=> 기본적으로 증감연산자가 우선적으로 수행된다!!

 

  • call by value 
#include <stdio.h>

void swap(int a, int b)
{
	int temp;
	
	temp = a;
	a = b;
	b = temp;
}

int main()
{
	int a, b;
	
	a = 10;
	b = 20;
	
	printf("swap 전 : %d %d\n", a, b);
	
	swap(a, b);
	
	printf("swap 후 : %d %d\n", a, b);
	
	return 0;
}

// swap함수에 의하여 a와 b가 바뀌더라도 본래 a,b는 바뀌지 않는다.

 

  • call by reference (call by address를 이용하여 구현한다.)
#include <stdio.h>

void swap(int *a, int *b)
{
	int temp;

	temp = *a;
	*a = *b;
	*b = temp;
}

int main()
{
	int a, b;

	a = 10;
	b = 20;

	printf("swap 전 : %d %d\n", a, b);

	swap(&a, &b);

	printf("swap 후 : %d %d\n", a, b);

	return 0;
}

// main함수의 a,b의 포인터를 활용하여 swap(a,b)를 통해 a,b의 값을 바꿀 수 있다.

 

  • 이중포인터
  •  

출처 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=smilennv&logNo=220304941459

 

  • 포인터 배열

 

 

  • 구조체

서로 다른 자료형의 변수들을 묶어서 하나의 새로운 자료형을 정의할 수 있음.

(ex) 학생들의 정보 관리 프로그램 : 이름, 학번 등등.. 을 표현

 

주의해야할 개념 : 구조체 선언 자체는 메모리를 할당하지 않음, 이후 구조체 변수를 선언했을때 메모리에 잡힌다.

 

구조체의 예시