일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 | 31 |
- git
- @Autowired
- AWS
- 구조체배열
- @Component
- 해시
- OpenCV
- 컴포넌트스캔
- 코딩테스트
- nestJS
- 알고리즘
- 파이썬
- nestjs auth
- 카카오 알고리즘
- python
- 카카오
- C++
- nestjs typeorm
- Spring
- spring boot
- C언어
- 코테
- 시스템호출
- 스프링
- 가상면접사례로배우는대규모시스템설계기초
- thymeleaf
- 프로그래머스
- TypeORM
- Nodejs
- 카카오 코테
- Today
- Total
공부 기록장 💻
[C언어] 포인터 본문
포인터의 개념과 주소 연산자 &
- 포인터: 메모리의 주소를 가지고 있는 변수
- 변수는 메모리에 저장된다. 메모리는 바이트(byte) 단위로 주소가 매겨져 있는데, 주소를 이용해 메모리에 접근하며 값을 읽고 저장할 수 있다. 변수의 주소는, 변수가 차지하는 바이트의 주소 중에서 가장 낮은 주소가 된다.
- 주소 연산자 &: 변수의 이름을 받아 변수의 주소를 반환하는 연산자
- 형식 지정자 16진수 출력- %p, 부호 없는 10진수 출력- %u
포인터의 선언과 초기화
- 포인터(pointer) 의 선언: (포인터가 가리키는 대상과 동일한 자료형) * (포인터 이름=포인터 변수명)
- 포인터 타입과 변수의 타입은 일치해야 함! 포인터에 의하여 참조되는 객체의 크기와 형식을 결정하는 것이 포인터의 타입이기 때문
- 포인터의 초기화: & 연산자를 이용하여 변수의 주소를 계산하여 포인터에 대입
int *p = NULL; // int형 포인터 p 선언 (0, NULL 값으로 초기화해주기!)
int i = 10; // 10의 값을 갖는 int형 변수 i 선언
p = &i; // i의 주소를 대입 -> 초기화
// int *p = &i;
- 포인터 변수가 가리킬 대상을 미리 알지 못하는 경우, 0이나 NULL 값으로 초기화해준다.
- 위 예시에서 포인터 p는 i의 주소를 저장하고 있다.
간접 참조 연산자 *
- 포인터를 이용하면 주소를 이용하여 직접 컴퓨터의 메모리에 접근하여 메모리를 조작할 수 있다.
- 간접 참조(dereferencing, indirection): 포인터가 가리키는 주소에 저장된 내용을 읽는 것
* 기호는 포인터 변수를 선언할 때 뿐 아니라 가리키는 값에 직접 접근하여 값을 읽고 변경할 수도 있다.
int *p = NULL;
int i = 10;
p = &i;
printf("*p = %d, i = %d\n", *p, i); // 포인터 p가 가리키는 값 = i에 저장되어 있는 값
printf("p = %d, &i = %d\n", p, &i); // 포인터 p의 값 = i의 주소값
*p = 20; // p가 가리키는 값을 20으로 변경(i의 값 변경)
printf("i = %d\n", i);
- 예시를 통해 i의 주소를 저장하고 있는 포인터 p는 * 연산자를 이용해 가리키는 값에 직접 접근할 수 있음을 확인할 수 있다. *p는 i의 값과 동일, p의 값은 i의 주소와 동일.
- 포인터는 변수이므로, 저장된 주소를 다른 값으로 언제든지 변경 가능하다. 또한, 가리키는 변수의 값을 직접 변경할 수도 있다.
- 일반적으로 메모리 관리는 운영 체제의 고유한 권한이므로, 아두이노와 같은 임베디드 시스템을 사용하는 경우가 아니라면 직접 주솟값을 포인터에 대입할 수 없다.
포인터의 연산, 증감 연산자
- 포인터의 덧셈, 뺄셈을 이용하여 포인터가 가리키는 값에 편리하게 접근하여 참조할 수 있다.
- 일반적인 변수에 대한 연산과는 조금 다르게, 증가하고 감소하는 값은 포인터가 가리키는 객체의 크기이다.
#include <stdio.h>
int main(void) {
int i = 10;
int list[5] = { 1,2,3,4,5 };
char c = 'a';
char s[] = "Hello";
int* pi = &i;
int* pi2 = list;
char* pc = &c;
char* pc2 = s;
printf("pi = %d, pi2 = %d, pc = %d, pc2 = %d\n", pi, pi2, pc, pc2); // 각 포인터(주솟값)의 값
printf("*pi2 = %d, *pc2 = %c\n\n", *pi2, *pc2); // pi2와 pic2가 가리키는 값
// pi2와 pic2의 값을 1 증가 (가리키는 객체의 크기만큼 주솟값 증가)
pi2++;
pc2++;
printf("pi2 = %d, *pi2 = %d\n", pi2, *pi2); // pi2와 pi2가 가리키는 값
printf("pc2 = %d, *pc2 = %c\n", pc2, *pc2); // pic2와 pic2가 가리키는 값
}
- 포인터에 정수형 변수 i와 문자형 변수 c의 주소를 대입하려면, & 주소 연산자를 사용하여야 한다.
- 배열을 포인터에 의 이름은 포인터이다. (배열이 시작하는 주소가 곧 포인터를 의미하다.)
포인터 형변환
포인터와 함수
포인터와 배열
'# Language & Tools > C' 카테고리의 다른 글
[C언어] 배열 - 배열의 선언, 배열 요소 복사와 비교, 선택 정렬, 순차 탐색, 이진 탐색, 2차원/다차원 배열 (0) | 2021.02.07 |
---|---|
[C언어] 동적 메모리 할당 - malloc(), calloc(), realloc(), free() (0) | 2021.02.03 |
[C언어] 구조체를 이용한 소규모 데이터베이스 관리 프로그램 (2) | 2021.02.03 |
[C언어] 구조체 - 구조체 변수 선언, 초기화, 구조체 포인터, 구조체 배열, 함수 (0) | 2021.02.02 |
[C언어] 문자열 처리 함수 <string.h> (0) | 2021.02.01 |