C언어 - 포인터의 기본적인 사용 방법
2020. 11. 11. 12:40ㆍ개인공부/C언어
int main() {
int a, b;
a = 123;
int *a_ptr; // * : asterisk
a_ptr = &a; // & : address-of operator
printf("%d %d %p\n", a, *a_ptr, a_ptr);
return 0;
}
출력 값:
123 123 0000002AE31EFB04
a : 123
*a_ptr : 123
a_ptr : 0000002AE31EFB04
주소값은 실행때마다 달라진다.
*a_ptr의 값이 123인 이유는 a_ptr의 주소로 가서 값을 읽어와서 이다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int a, b;
a = 123;
int *a_ptr; // * : asterisk
a_ptr = &a; // & : address-of operator
printf("%d %d %p\n", a, *a_ptr, a_ptr);
//printf로 주소를 출력할때는 %p를 사용한다.
*a_ptr = 456; // * : re-direction or de-referencing
printf("%d %d %p\n", a, *a_ptr, a_ptr);
return 0;
}
*a_ptr = 456;
a의 주소값을 가르키고 있는 *a_ptr 에 456을 넣으니
a의 값도 456이 되었다. 같은 주소를 가지고 있기 때문이다.
여기서
b = a_ptr;
정수형 변수(int b)에 주소(a_prt)를 넣으려고 한다.
그럼 아래와 같이 워닝이뜬다.
warning C4047: '=': 'int' differs in levels of indirection from 'int *'
b =*a_ptr; 로 쓰여야 할걸 b=a_ptr;로 쓴것 아니냐고 경고를 준것이다.
왜냐하면 주소값은 16진수인 hex이기 때문이당 ^^~
c언어에서는 프로그래머가
b = (int)a_ptr;
위와 같이 주소값을 int로 형변환 하려는 의도가 아니었나 고려하기 때문에 에러를 준것이 아니라 워닝을준것.
위와 같이 그대로 빌드하면
형변환된 주소는 -869271548 로 나온다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int a, b;
a = 123;
int *a_ptr;
a_ptr = &a;
printf("%d %d %p\n", a, *a_ptr, a_ptr);
// a: 123
// *a_ptr : 123
// a_ptr : 000000BC4A34F5C4
*a_ptr = 456; // * : re-direction or de-referencing
printf("%d %d %p\n", a, *a_ptr, a_ptr);
// a: 456
// *a_ptr : 456
// a_ptr : 000000BC4A34F5C4
b = *a_ptr;
printf("%d\n", b);
//456
*a_ptr = 789;
printf("%d\n", b);
//456
printf("%d %d %p %p\n", a, *a_ptr, a_ptr, &b);
// a: 789
// *a_ptr : 789
// a_ptr : 000000BC4A34F5C4
// &b : 000000BC4A34F5E4
b = 12;
printf("%d\n", b);
//12
printf("%d %d %p\n", a, *a_ptr, a_ptr);
// a: 789
// *a_ptr : 789
// a_ptr : 000000BC4A34F5C4
a = 1004;
printf("%d %d %p %d\n", a, *a_ptr, a_ptr, b);
// a: 1004
// *a_ptr : 1004
// a_ptr : 000000BC4A34F5C4
// b : 12
return 0;
}
아직 좀 헷갈리긴 하지만 머리에 조금씩 안착이 되는 느낌이 든다.
더 파고들자.
출처 : 홍정모의 따라배우는 C언어
'개인공부 > C언어' 카테고리의 다른 글
C언어 - 배열과 메모리 (0) | 2020.11.11 |
---|---|
C언어 - NULL 포인터와 런타임 에러 (0) | 2020.11.11 |
C언어 : 포인터의 작동원리 (0) | 2020.11.11 |
C언어 - 헤더파일 만들기 (0) | 2020.11.11 |
C언어 - 피보나치 예제와 재귀 호출의 장단점 (0) | 2020.11.11 |