1) 포인터란?
- 메모리의 주소값(일반적으로 16진수 값으로 표현)
- 포인터 변수 : 포인터를 값으로 가질 수 있는 변수
2) 포인터 변수 선언
- 포인터 변수 선언 시 변수 이름 앞에 *를 붙여서 선언
- 자료형 지정 포인터 변수 : 지정된 자료형의 메모리 주소값만 저장
- 자료형 미지정 포인터 변수 : 모든 자료형의 메모리 주소값을 저장, 자료형 대신에 void 사용
3) 포인터 변수 초기화
- 일반 변수의 메모리 주소값 지정
- 참조 연산자(&)를 일반변수 이름 앞에 붙여서 사용
- 메모리 주소값 0을 의미하는 NULL 지정
4) scanf_s()함수 사용 시 주소 참조 연산자(&) 사용하지 않음
5) 포인터 변수 출력하기 : 간접 참조 연산자(*)를 포인터 변수 이름 앞에 붙여서 사용
6) 포인터의 연산
- 정수값을 이용한 덧셈과 뺄셈 연산만 가능
- 동일한 자료형 포인터끼리 대입 연산 가능
- 포인터 증감 연산 : 자료형의 크기 만큼 증감
7) void 포인터 변수
- 포인터 변수의 자료형을 미지정
- 모든 자료형의 포인터를 지정할 수 있음
8) 이중 포인터 변수의 개요
- 포인터 변수의 포인터를 저장하는 변수
- 변수이름 앞에 **를 붙여서 선언
1) 일차원 배열과 포인터의 관계
- 배열 변수 이름은 포인터 변수임
- 배열의 각 요소는 메모리에 연속해서 저장됨
- 배열의 각 요소는 포인터 변수로 표현할 수 있음
2) 이차원 배열과 포인터의 관계
- 배열 변수 이름과 행을 대표하는 변수 이름은 포인터 변수임
- 배열의 각 요소는 메모리에 연속해서 저장됨
- 배열의 각 요소는 포인터 변수로 표현할 수 있음
- 배열 포인터를 이용하여 배열 처럼 사용 가능
3) 포인터 배열 이해하기
- 포인터가 배열의 요소인 배열
- 포인터 배열 선언 : 배열이름 앞에 *를 붙여서 선언
1) 3행*3열의 2차원 배열 2개 선언 및 초기화
2) 배열 2개에 행렬 합을 구하기
#include <stdio.h>
#define COL 3
#define ROW 3
int main()
{
int a[COL][ROW] = { {1,2,3}, {4,5,6}, {7,8,9} };
int b[COL][ROW] = { {1,2,3}, {4,5,6}, {7,8,9} };
int c[COL][ROW] = { {0,0,0}, {0,0,0}, {0,0,0} };
// 포인터를 사용하지 않는 경우
/*
for (int i = 0; i < COL; i++) {
for (int j = 0; j < ROW; j++) {
c[i][j] = a[i][j] + b[i][j];
}
}
*/
// 포인터를 사용하는 경우
int *pa = a;
int *pb = b;
int *pc = c;
for (int i = 0; i < COL * ROW; i++) {
*(pc+i) = *(pa+i) + *(pb+i);
// * pc++ = *pa++ + *pb++; // 동일함.
}
// 화면 출력
for (int i = 0; i < COL; i++) {
for (int j = 0; j < ROW; j++) {
printf("%4d", a[i][j]);
}
printf(" ");
for (int j = 0; j < ROW; j++) {
printf("%4d", b[i][j]);
}
printf(" ");
for (int j = 0; j < ROW; j++) {
printf("%4d", c[i][j]);
}
printf("\n");
}
}
<Result>
1 2 3 1 2 3 2 4 6
4 5 6 4 5 6 8 10 12
7 8 9 7 8 9 14 16 18