- 포인터 변수 (포인터)
주소 값(포인터)를 저장할 수 있는 변수로 다른 메모리 공간을 카르킨다.
- 포인터 변수 선언
#include <stdio.h>
int main()
{
int *p = NULL; // int* p == int * p 모두 같음(포인터생성)
int num = 15; // num의 값은 15
p = # //포인터p = num의 주소
printf("int 변수 num의 주소 : %d \n", &num);
printf("포인터 p의 값 : %d \n", p);
printf("포인터 p가 가리키는 값 : %d \n", *p);
//num과 *p는 동일하게 사용되어 짐을 알 수 있다.
return 0;
}
- 포인터와 연산자의 우선순위
- (*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의 값을 바꿀 수 있다.
- 이중포인터
- 포인터 배열
- 구조체
서로 다른 자료형의 변수들을 묶어서 하나의 새로운 자료형을 정의할 수 있음.
(ex) 학생들의 정보 관리 프로그램 : 이름, 학번 등등.. 을 표현
주의해야할 개념 : 구조체 선언 자체는 메모리를 할당하지 않음, 이후 구조체 변수를 선언했을때 메모리에 잡힌다.
'학교 수업 > 임베디드 시스템' 카테고리의 다른 글
[리눅스 프로그래밍]2. 리눅스 사용 (0) | 2022.10.11 |
---|---|
[리눅스 프로그래밍] 1. 유닉스/리눅스 란? (0) | 2022.10.10 |