티스토리 뷰
5. 포인터
1. 포인터
자료의 주소를 저장하는 변수. (값 참조)
형태: 자료형 *변수이름;
* : 포인터 변수를 선언하는 포인터 연산자
& : 변수의 주소 알려주는 주소연산자
ex)
int *pointer;
int num = 1;
pointer = # // pointer 변수에 현재 num의 주소값 저장
포인터 변수에 값을 할당하고 싶으면 넣고 싶은 주소를 변수에서 주소연산자, &을 이용해 뽑는다.
& 연산자를 피연산자의 주소로 반환한다.
-
& 연산자의 피연산자는 반드시 변수이어야만 한다.
-
포인터 변수와 형(int, float, ...)과 주소값에 저장될 변수의 자료형은 반드시 일치해야 한다.
-
포인터 변수를 선언하고 당장 사용하지 않으면 NULL 값을 채워넣는 것을 권장한다. - 널포인터
-
보통변수는 값을 읽거나 쓰는 것을 변수의 유효 범위(scope) 내에서만 가능하지만, 주소를 쓰면 변수의 유효 범위(scope) 밖에서도 변수 변경이 가능하다.
ex)
int *pointer;
int num = 1;
pointer = #
*pointer = 2;
포인터 변수 앞에 *연산자를 사용하면 이는 포인터 변수가 담고 있는 변수의 값에 접근하는 것이다.
ex)
void swap(int a, int b)
{
int temp = *a; // 여기서 *는 변수값에 접근하기 위해 사용됐다.
*a = *b;
*b = temp;
}
*는 2가지 의미로 사용하는데, 첫번째는 포인터 선언할 때, 두번쨰는 변수 값에 접근할 때 사용한다.
포인터 변수 선언 후, 포인터 변수인지 일반 변수인지 알 수 없다. (구분을 위해 관례상 변수 앞에 p_를 붙이는 편이다.)
2. 더블포인터
ex)
#include <stdio.h>
void swap(int **a, int **b)
{
int *temp = *a;
*a = *b;
*b = temp;
}
void main()
{
int num1 = 10;
int num2 = 20;
int *p1 = &num1;
int *p2 = &num2;
swap(&p1, &p2);
printf("%d %d", *p1, *p2);
return(0);
}
p1, p2의 값에 num1, num2의 주소가 들어가고, swap되서 p1와 p2의 주소가 서로 바뀐 것.
주의: num의 주소 안의 값이 바꾼 것이 아니라, num의 주소를 가리키는 방향을 바꾼 것이다!
'SW > C' 카테고리의 다른 글
C_7. DFS & BFS (0) | 2020.01.05 |
---|---|
C_6. 재귀함수 (0) | 2020.01.05 |
C_4. 오버플로우 & 언더플로우 (0) | 2020.01.04 |
C_3. 정적 메모리 할당 & 동적 메모리 할당 (0) | 2020.01.04 |
C_2. 정적 라이브러리 & 동적 라이브러리 (0) | 2020.01.04 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 컴퓨터과학
- 컴퓨터의 시초
- 계산기
- 기계적 추론
- 기본개념
- 영화
- 이광근
- 앨런 튜링
- 정수
- 독서
- 유니티 기초
- 초보자를 위한 C# 200제
- 컴퓨터과학이 여는 세계
- 뇌를 자극하는 C# 5.0 프로그래밍
- 오버플로우
- c#
- 튜링
- 초보
- 프로그램
- c
- dynamic
- 에니그마
- 서울대
- 수리 명제 자동판결 문제
- 프로그래밍
- 비전공자
- 동적
- 두 수 입력
- 메서드
- 나눗셈
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함