SlideShare uma empresa Scribd logo
1 de 43
C언어와 포인터 (1)
포인터의 사용법
"완전학습을 지향하는" NHN NEXT 정호영
나눔고딕 및 나눔고딕코딩 글꼴을 설치해 주세요.
포인터의 용도
1. 원하는 메모리 번지에 직접 값을 쓰기
2. 변수의 동적 할당
3. Call by Reference
4. 배열과 문자열의 조작
5. 구조체의 효율적 사용
등등…
0. void 포인터 이야기
void *는 무엇이든 담을 수 있는 그릇입니다.
void *ptr;
int a = 10;
double d = 3.14;
ptr = &a; //ok
ptr = &d; //ok
void 포인터에 * 연산자를 사용하면 어떻게 될까요?
void *ptr;
double d = 3.14;
ptr = &d; //ok
printf("%fn", *ptr);
void 포인터는
포인티의 타입이 정해지지 않았기 때문에
읽을 수 없습니다.
그럼 어떻게
void 포인터의 포인티 값을 읽을까요?
정답은 캐스팅 (형변환) 입니다.
1. void 포인터를 포인티의 포인터 타입으로 형변환
2. * 연산자를 붙여서 값을 읽는다.
예제
(double *) ptr
void *ptr;
double d = 3.14;
ptr = &d; //ok
printf("%fn", *((double *)ptr)); //ok
*((double *) ptr)
불편한 void*를 왜 사용하는지는 조금 뒤에…
1. 메모리에 직접 값을 쓰기
메모리의 원하는 번지에 직접 값을 쓰는 경우가 있습니다.
하드웨어를 직접 제어하는 경우, 많이 사용합니다.
예) 0x378 번지의 값이 1이면 USB가 살아있다.
char *alive = (char *) 0x378;
if (*alive == 1) {
//USB가 살아 있구나. 뭘 하지?
} else {
//USB가 안 살아있음, 다른 일을 하자.
}
2. 동적할당
malloc
calloc
free
지난 시간에 우리 마음대로 사용할 수 있는 heap 이라고
하는 공간이 있다고 했습니다.
이 공간을
배정받는 함수
malloc()
calloc()
반납하는 함수
free()
void *malloc(size_t size);
void free(void *ptr);
void *calloc(size_t n, size_t size);
우리가 요청한 크기만큼 힙에 공간을 할당해 줍니다.
리턴값은 요청한 공간의 시작주소입니다.
free함수는 할당한 메모리를 해제할 때 사용합니다.
할당하고 해제하지 않으면 leak이 발생할 수 있습니다.
예제) int 크기만큼 공간을 할당받고 싶어요.
//NAVER cast void * to int * in this case!
int *ptr = malloc(sizeof(int));
*ptr = 50;
printf("%dn", *ptr);
free(ptr);
예제) int 3개만큼 동적 할당을 하고 싶어요.
*포인터의 덧셈이 잠깐 나왔습니다.
int *ptr = malloc(sizeof(int)*3);
int *temp;
*ptr = 10;
temp = ptr + 1;
*temp = 20;
printf("%dn", *ptr); //10
printf("%dn", *(ptr + 1)); //?
예제) calloc을 사용해 봅시다.
*포인터의 덧셈이 잠깐 나왔습니다.
int *ptr = calloc(3, sizeof(int));
int *temp;
*ptr = 10;
temp = ptr + 1;
*temp = 20;
printf("%dn", *ptr);
printf("%dn", *(ptr + 1));
3. Call by Reference
C언어의 먼 선조인 포트란은
함수에 인자를 전달할 때 원본을 그대로 전달했습니다.
아래 언어가 포트란이라면…
void foo(int i) {
i = i + 10;
}
main() {
a = 100;
foo(a);
printf("%dn", a);
}
// 포트란이라면 (오해하지 마세요)
// 200
// C니까
100
조금 더 자세한 설명을 위해 용어를 정의합니다.
argument: 실제 호출하는 쪽에서는 넘겨주는 변수
parameter: 함수의 정의에 있는 변수
앞쪽에서
parameter: i
argument: a
모르는 분이 엄청 많습니다.
중요한 건 C언어는
argument 에서 parameter 로 갈 때 복사본을 전달해 준
다는 사실입니다.
이것을 call by value 라고 합니다.
-- return 값도 마찬가지로 복사가 일어납니다.
call by value
- argument의 값이 바뀌지 않는다.
- 복사본을 전달한다.
call by reference
- argument의 값이 바뀐다.
- 원본을 전달한다.
call by value는 성능상 문제가 되기도 합니다.
그런데 C 언어에는
call by reference 가 없습니다!!
뭐라고??
Java
- 일반 변수는 call by value
- 배열, 클래스 등 복합 타입 변수는 call by reference
- 포인터는 완전히 사라졌다!
c++
- 선언에 &를 사용하면 참조 연산자!
- c++ 최대의 실수
- 포인터도 여전히 사용할 수 있다.
프로그래머의 욕심은 끝이 없고, 같은 실수를 반복한다.
c# = C++ + C++
기본 골격은 java와 같지만 내 마음대로 선언도 가능
parameter에 ref 키워드 사용하면 call by reference
argument에도 반드시 ref 키워드를 사용해야 함
C언어에는
call by reference 흉내가 있습니다.
call by address 라고 하는 게 더 맞는 표현입니다.
이 때 포인터를 사용합니다!
void foo(int *i) {
*i = *i + 10;
}
int main(void) {
int a = 100;
foo(&a);
printf("%dn", a);
return 0;
}
//실행 결과
200
int 변수에 대해 call by reference 를 하기 위해서
int * 를 사용했습니다.
char 변수의 call by reference를 하려면?
double 변수의 call by reference를 하려면?
int* 변수의 call by reference를 하려면?
int 변수에 대해 call by reference 를 하기 위해서
int * 를 사용했습니다.
char 변수의 call by reference를 하려면? char *
double 변수의 call by referenc를 하려면? double *
int* 변수의 call by reference를 하려면? int **
int myalloc(int *ptr, unsigned int size)를 구현합니다.
- int 전용 동적할당 함수
- 성공하면 size, 실패하면 -1을 리턴
int myalloc (int *ptr, unsigned int numb) {
//implement
}
int main(void) {
int *ptr = NULL;
int ret = myalloc(ptr, 1);
if (ret == -1) return 1;
*ptr = 5054;
printf("%dn", *ptr);
return 0;
}
어떻게 구현하든지 앞의 함수는 틀렸습니다.
argument로 전달한 ptr은 값이 바뀌지 않기 때문입니다.
int *를 call by reference로 호출하려면
int **를 사용합니다.
int myalloc (int **ptr, unsigned int numb) {
*ptr = malloc(sizeof(int) * numb);
if (ptr) return numb;
else return -1;
}
int main(void) {
int *ptr = NULL;
int ret = myalloc(&ptr, 1);
if (ret == -1) return 1;
*ptr = 5054;
printf("%dn", *ptr);
return 0;
}
이중 포인터의 용법1
단일 포인터의
call by reference를 위해
4. 포인터와 배열
C언어의 배열은 90% 정도 포인터랑 닮았습니다.
포인터에도 배열 연산을 그대로 쓸 수 있습니다!
int arr[5];
double b[]= {1, 2, 3, 4, 5}; //자동으로 5개가 됨
이 코드를 실행해 보고 알아낸 사실을 토의해 봅시다.
int main(void){
int a[5] = {1,2,3,4,5};
printf("%pn", a);
printf("%p %dn", &a[0], a[0]);
printf("%p %dn", &a[1], a[1]);
return 0;
}
놀랍게도 배열이름 변수에는
배열의 첫번째 원소의 주소가 들어갑니다!
arr = &arr[0]
int의 주소를 저장한 변수 = int *
포인터를 배열에 대입해서 쓸 수 있을까요?
HULL?
int main(void){
int a[5] = {1,2,3,4,5};
int *ptr = a; //not &a, &a[0]도 OK
printf("%pn", ptr);
printf("%p %dn", ptr, *ptr);
printf("%p %dn", ptr + 1, *(ptr +1));
return 0;
}
HULL?
무언가 수상하지요?
int main(void){
int a[5] = {1,2,3,4,5};
int *ptr = a; //not &a, &a[0]도 OK
printf("%pn", ptr);
printf("%p %dn", ptr + 0, *(ptr + 0));
printf("%p %dn", ptr + 1, *(ptr + 1));
return 0;
}
int main(void){
int a[5] = {1,2,3,4,5};
printf("%pn", a);
printf("%p %dn", &a[0], a[0]);
printf("%p %dn", &a[1], a[1]);
return 0;
}
HULL?
포인터가 미쳐 날뛰고 있습니다!!
int main(void) {
int a[5] = {1,2,3,4,5};
int *ptr = a;
printf("%pn", ptr);
printf("%p %dn", &ptr[0], ptr[0]);
printf("%p %dn", &ptr[1], ptr[1]);
return 0;
}
int main(void) {
int a[5] = {1,2,3,4,5};
printf("%pn", a);
printf("%p %dn", &a[0], a[0]);
printf("%p %dn", &a[1], a[1]);
return 0;
}
사실 a[i] 는 *(a + i) 랑 완전히 똑같습니다.
사람의 편의를 위해 읽기 쉽게 만들어 준 거랍니다.
이런 걸 syntax sugar 라고 합니다.
a[i] = *(a + i)
*나중에 다시 나오지만 a->b도 syntax sugar 입니다.
다 아는 산수 한 번 해볼까요?
a[3] = *(a + 3)
= *(3 + a)
= 3[a]
int main() {
int a[5] = {1,2,3,4,5};
for (int i = 0; i < 5; i++)
printf("%dn", i[a]);
return 0;
}
(형~오빠~, 이거 어디가 잘못된 건지 좀 가르쳐 주세요.)
잘못된 건 비뚤어진 너의 마음이다 ㅋㅋ.
죄송합니다.
된다고 절대 사용하면 안 됩니다.
To be continued…

Mais conteúdo relacionado

Mais procurados

정규표현식 Regular expression (regex)
정규표현식 Regular expression (regex)정규표현식 Regular expression (regex)
정규표현식 Regular expression (regex)Sunyoung Kim
 
Python3 10장 문자열이야기
Python3 10장 문자열이야기Python3 10장 문자열이야기
Python3 10장 문자열이야기Jihoon Kong
 
Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버Jaejin Yun
 
[170529 6주차]C언어 A반
[170529 6주차]C언어 A반[170529 6주차]C언어 A반
[170529 6주차]C언어 A반arundine
 
2012 Ds D2 03
2012 Ds D2 032012 Ds D2 03
2012 Ds D2 03chl132435
 
6장 표현식 및 문장
6장 표현식 및 문장6장 표현식 및 문장
6장 표현식 및 문장재정 이
 
2012 Ds D2 03 Pdf
2012 Ds D2 03 Pdf2012 Ds D2 03 Pdf
2012 Ds D2 03 Pdfkd19h
 
정규표현식(Regular expressions)
정규표현식(Regular expressions)정규표현식(Regular expressions)
정규표현식(Regular expressions)Juhee Kim
 
배열과 포인터
배열과 포인터배열과 포인터
배열과 포인터영기 김
 
C Language For Arduino
C Language For ArduinoC Language For Arduino
C Language For Arduino영욱 김
 
Python3 brief summary
Python3 brief summaryPython3 brief summary
Python3 brief summaryHoChul Shin
 
파이썬 숫자,변수,문자열
파이썬 숫자,변수,문자열파이썬 숫자,변수,문자열
파이썬 숫자,변수,문자열HoYong Na
 
자료구조 그래프 보고서
자료구조 그래프 보고서자료구조 그래프 보고서
자료구조 그래프 보고서mil23
 

Mais procurados (20)

정규표현식 Regular expression (regex)
정규표현식 Regular expression (regex)정규표현식 Regular expression (regex)
정규표현식 Regular expression (regex)
 
Python3 10장 문자열이야기
Python3 10장 문자열이야기Python3 10장 문자열이야기
Python3 10장 문자열이야기
 
Erlang
ErlangErlang
Erlang
 
Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버
 
Regex
RegexRegex
Regex
 
[170529 6주차]C언어 A반
[170529 6주차]C언어 A반[170529 6주차]C언어 A반
[170529 6주차]C언어 A반
 
2012 Ds D2 03
2012 Ds D2 032012 Ds D2 03
2012 Ds D2 03
 
6장 표현식 및 문장
6장 표현식 및 문장6장 표현식 및 문장
6장 표현식 및 문장
 
2012 Ds D2 03 Pdf
2012 Ds D2 03 Pdf2012 Ds D2 03 Pdf
2012 Ds D2 03 Pdf
 
Java standard(8~13)
Java standard(8~13)Java standard(8~13)
Java standard(8~13)
 
What’s new in c++11
What’s new in c++11What’s new in c++11
What’s new in c++11
 
C++11
C++11C++11
C++11
 
Study1
Study1Study1
Study1
 
정규표현식(Regular expressions)
정규표현식(Regular expressions)정규표현식(Regular expressions)
정규표현식(Regular expressions)
 
배열과 포인터
배열과 포인터배열과 포인터
배열과 포인터
 
5주차 스터디
5주차 스터디5주차 스터디
5주차 스터디
 
C Language For Arduino
C Language For ArduinoC Language For Arduino
C Language For Arduino
 
Python3 brief summary
Python3 brief summaryPython3 brief summary
Python3 brief summary
 
파이썬 숫자,변수,문자열
파이썬 숫자,변수,문자열파이썬 숫자,변수,문자열
파이썬 숫자,변수,문자열
 
자료구조 그래프 보고서
자료구조 그래프 보고서자료구조 그래프 보고서
자료구조 그래프 보고서
 

Destaque

내 질문에는 왜 답변이 달리지 않을까
내 질문에는 왜 답변이 달리지 않을까내 질문에는 왜 답변이 달리지 않을까
내 질문에는 왜 답변이 달리지 않을까Hoyoung Jung
 
포인터의 공식
포인터의 공식포인터의 공식
포인터의 공식Hoyoung Jung
 
Memory & object pooling
Memory & object poolingMemory & object pooling
Memory & object poolingNam Hyeonuk
 
TCP/IP Protocol - JAVA
TCP/IP Protocol - JAVATCP/IP Protocol - JAVA
TCP/IP Protocol - JAVAcooddy
 
네트워크 스터디(Tcp 소켓 프로그래밍)
네트워크 스터디(Tcp 소켓 프로그래밍)네트워크 스터디(Tcp 소켓 프로그래밍)
네트워크 스터디(Tcp 소켓 프로그래밍)MoonLightMS
 
[네트워크] TCP, 믿을 수 있나요!?
[네트워크] TCP, 믿을 수 있나요!?[네트워크] TCP, 믿을 수 있나요!?
[네트워크] TCP, 믿을 수 있나요!?용민 박
 
뇌자T 1.네트워크와 tcpip
뇌자T   1.네트워크와 tcpip뇌자T   1.네트워크와 tcpip
뇌자T 1.네트워크와 tcpipsj k
 
Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15Nam Hyeonuk
 
[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)
[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)
[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)해강
 
Tcp ip & io model
Tcp ip & io modelTcp ip & io model
Tcp ip & io modelNam Hyeonuk
 
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)TOAST_NHNent
 
파이썬 데이터 검색
파이썬 데이터 검색파이썬 데이터 검색
파이썬 데이터 검색Yong Joon Moon
 
소프트웨어 개발자를 위한 하드웨어 상식
소프트웨어 개발자를 위한 하드웨어 상식소프트웨어 개발자를 위한 하드웨어 상식
소프트웨어 개발자를 위한 하드웨어 상식중선 곽
 
Sync async-blocking-nonblocking-io
Sync async-blocking-nonblocking-ioSync async-blocking-nonblocking-io
Sync async-blocking-nonblocking-ioCheoloh Bae
 
Next 게임 실전 프로젝트 슬라이드
Next 게임 실전 프로젝트 슬라이드Next 게임 실전 프로젝트 슬라이드
Next 게임 실전 프로젝트 슬라이드Nam Hyeonuk
 
[D2 CAMPUS]웹 개발자의 스펙 : HTTP
[D2 CAMPUS]웹 개발자의 스펙 : HTTP[D2 CAMPUS]웹 개발자의 스펙 : HTTP
[D2 CAMPUS]웹 개발자의 스펙 : HTTPNAVER D2
 
Effective c++chapter8
Effective c++chapter8Effective c++chapter8
Effective c++chapter8성연 김
 
패킷의 전달과정
패킷의 전달과정패킷의 전달과정
패킷의 전달과정성연 김
 

Destaque (20)

내 질문에는 왜 답변이 달리지 않을까
내 질문에는 왜 답변이 달리지 않을까내 질문에는 왜 답변이 달리지 않을까
내 질문에는 왜 답변이 달리지 않을까
 
포인터의 공식
포인터의 공식포인터의 공식
포인터의 공식
 
Memory & object pooling
Memory & object poolingMemory & object pooling
Memory & object pooling
 
TCP/IP Protocol - JAVA
TCP/IP Protocol - JAVATCP/IP Protocol - JAVA
TCP/IP Protocol - JAVA
 
Database
DatabaseDatabase
Database
 
네트워크 스터디(Tcp 소켓 프로그래밍)
네트워크 스터디(Tcp 소켓 프로그래밍)네트워크 스터디(Tcp 소켓 프로그래밍)
네트워크 스터디(Tcp 소켓 프로그래밍)
 
[네트워크] TCP, 믿을 수 있나요!?
[네트워크] TCP, 믿을 수 있나요!?[네트워크] TCP, 믿을 수 있나요!?
[네트워크] TCP, 믿을 수 있나요!?
 
뇌자T 1.네트워크와 tcpip
뇌자T   1.네트워크와 tcpip뇌자T   1.네트워크와 tcpip
뇌자T 1.네트워크와 tcpip
 
Multi thread
Multi threadMulti thread
Multi thread
 
Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15
 
[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)
[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)
[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)
 
Tcp ip & io model
Tcp ip & io modelTcp ip & io model
Tcp ip & io model
 
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
 
파이썬 데이터 검색
파이썬 데이터 검색파이썬 데이터 검색
파이썬 데이터 검색
 
소프트웨어 개발자를 위한 하드웨어 상식
소프트웨어 개발자를 위한 하드웨어 상식소프트웨어 개발자를 위한 하드웨어 상식
소프트웨어 개발자를 위한 하드웨어 상식
 
Sync async-blocking-nonblocking-io
Sync async-blocking-nonblocking-ioSync async-blocking-nonblocking-io
Sync async-blocking-nonblocking-io
 
Next 게임 실전 프로젝트 슬라이드
Next 게임 실전 프로젝트 슬라이드Next 게임 실전 프로젝트 슬라이드
Next 게임 실전 프로젝트 슬라이드
 
[D2 CAMPUS]웹 개발자의 스펙 : HTTP
[D2 CAMPUS]웹 개발자의 스펙 : HTTP[D2 CAMPUS]웹 개발자의 스펙 : HTTP
[D2 CAMPUS]웹 개발자의 스펙 : HTTP
 
Effective c++chapter8
Effective c++chapter8Effective c++chapter8
Effective c++chapter8
 
패킷의 전달과정
패킷의 전달과정패킷의 전달과정
패킷의 전달과정
 

Semelhante a 포인터의기초 (2) - 포인터 사용하기1

코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)유익아카데미
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinDong Chan Shin
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오Taeoh Kim
 
2012 Ds B1 01
2012 Ds B1 012012 Ds B1 01
2012 Ds B1 01seonhyung
 
게임프로그래밍입문 3주차
게임프로그래밍입문 3주차게임프로그래밍입문 3주차
게임프로그래밍입문 3주차Yeonah Ki
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)Sang Don Kim
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
 
C언어 세미나 - 함수
C언어 세미나 - 함수C언어 세미나 - 함수
C언어 세미나 - 함수SeungHyun Lee
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택JinTaek Seo
 
Visual studio 2010
Visual studio 2010Visual studio 2010
Visual studio 2010MinGeun Park
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장SeongHyun Ahn
 
Data Structure 3
Data Structure 3Data Structure 3
Data Structure 3yonsei
 
C++정리 스마트포인터
C++정리 스마트포인터C++정리 스마트포인터
C++정리 스마트포인터fefe7270
 
문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의Kwangyoun Jung
 
Gpg gems1 1.3
Gpg gems1 1.3Gpg gems1 1.3
Gpg gems1 1.3david nc
 
[Swift] Functions
[Swift] Functions[Swift] Functions
[Swift] FunctionsBill Kim
 

Semelhante a 포인터의기초 (2) - 포인터 사용하기1 (20)

포인터
포인터포인터
포인터
 
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshin
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오
 
2012 Ds B1 01
2012 Ds B1 012012 Ds B1 01
2012 Ds B1 01
 
게임프로그래밍입문 3주차
게임프로그래밍입문 3주차게임프로그래밍입문 3주차
게임프로그래밍입문 3주차
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
 
C언어 세미나 - 함수
C언어 세미나 - 함수C언어 세미나 - 함수
C언어 세미나 - 함수
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택
 
Visual studio 2010
Visual studio 2010Visual studio 2010
Visual studio 2010
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장
 
HI-ARC PS 101
HI-ARC PS 101HI-ARC PS 101
HI-ARC PS 101
 
Data Structure 3
Data Structure 3Data Structure 3
Data Structure 3
 
06장 함수
06장 함수06장 함수
06장 함수
 
C++정리 스마트포인터
C++정리 스마트포인터C++정리 스마트포인터
C++정리 스마트포인터
 
문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의
 
Study1
Study1Study1
Study1
 
Gpg gems1 1.3
Gpg gems1 1.3Gpg gems1 1.3
Gpg gems1 1.3
 
[Swift] Functions
[Swift] Functions[Swift] Functions
[Swift] Functions
 

Mais de Hoyoung Jung

철권 1단에서 벗어나기
철권 1단에서 벗어나기철권 1단에서 벗어나기
철권 1단에서 벗어나기Hoyoung Jung
 
코딩 공부 시작하기
코딩 공부 시작하기코딩 공부 시작하기
코딩 공부 시작하기Hoyoung Jung
 
entry를 이용한 코딩 교육1
entry를 이용한 코딩 교육1entry를 이용한 코딩 교육1
entry를 이용한 코딩 교육1Hoyoung Jung
 
stored procedure2 + jdbc
stored procedure2 + jdbcstored procedure2 + jdbc
stored procedure2 + jdbcHoyoung Jung
 
mysql stored procedure
mysql stored proceduremysql stored procedure
mysql stored procedureHoyoung Jung
 
암달의 법칙과 쿼리튜닝 기초
암달의 법칙과 쿼리튜닝 기초암달의 법칙과 쿼리튜닝 기초
암달의 법칙과 쿼리튜닝 기초Hoyoung Jung
 
mysql 서브쿼리
mysql 서브쿼리mysql 서브쿼리
mysql 서브쿼리Hoyoung Jung
 
GROUP BY, CASE WHEN
GROUP BY, CASE WHENGROUP BY, CASE WHEN
GROUP BY, CASE WHENHoyoung Jung
 
데이터베이스 정규화
데이터베이스 정규화데이터베이스 정규화
데이터베이스 정규화Hoyoung Jung
 
MySQL 인덱스의 기초
MySQL 인덱스의 기초MySQL 인덱스의 기초
MySQL 인덱스의 기초Hoyoung Jung
 
tomcat jdbc mysql 프로그래밍
tomcat jdbc mysql 프로그래밍tomcat jdbc mysql 프로그래밍
tomcat jdbc mysql 프로그래밍Hoyoung Jung
 
데이터베이스 모델링
데이터베이스 모델링데이터베이스 모델링
데이터베이스 모델링Hoyoung Jung
 
MySQL delete.update
MySQL delete.updateMySQL delete.update
MySQL delete.updateHoyoung Jung
 
2. MySQL DataTye Basic
2. MySQL DataTye Basic2. MySQL DataTye Basic
2. MySQL DataTye BasicHoyoung Jung
 
MySQL Create Table
MySQL Create TableMySQL Create Table
MySQL Create TableHoyoung Jung
 

Mais de Hoyoung Jung (20)

철권 1단에서 벗어나기
철권 1단에서 벗어나기철권 1단에서 벗어나기
철권 1단에서 벗어나기
 
코딩 공부 시작하기
코딩 공부 시작하기코딩 공부 시작하기
코딩 공부 시작하기
 
entry를 이용한 코딩 교육1
entry를 이용한 코딩 교육1entry를 이용한 코딩 교육1
entry를 이용한 코딩 교육1
 
Github Markdown
Github MarkdownGithub Markdown
Github Markdown
 
stored procedure2 + jdbc
stored procedure2 + jdbcstored procedure2 + jdbc
stored procedure2 + jdbc
 
mysql stored procedure
mysql stored proceduremysql stored procedure
mysql stored procedure
 
암달의 법칙과 쿼리튜닝 기초
암달의 법칙과 쿼리튜닝 기초암달의 법칙과 쿼리튜닝 기초
암달의 법칙과 쿼리튜닝 기초
 
mysql 서브쿼리
mysql 서브쿼리mysql 서브쿼리
mysql 서브쿼리
 
GROUP BY, CASE WHEN
GROUP BY, CASE WHENGROUP BY, CASE WHEN
GROUP BY, CASE WHEN
 
트랜잭션
트랜잭션 트랜잭션
트랜잭션
 
데이터베이스 정규화
데이터베이스 정규화데이터베이스 정규화
데이터베이스 정규화
 
MySQL 인덱스의 기초
MySQL 인덱스의 기초MySQL 인덱스의 기초
MySQL 인덱스의 기초
 
tomcat jdbc mysql 프로그래밍
tomcat jdbc mysql 프로그래밍tomcat jdbc mysql 프로그래밍
tomcat jdbc mysql 프로그래밍
 
MySQL JOIN
MySQL JOINMySQL JOIN
MySQL JOIN
 
데이터베이스 모델링
데이터베이스 모델링데이터베이스 모델링
데이터베이스 모델링
 
MySQL delete.update
MySQL delete.updateMySQL delete.update
MySQL delete.update
 
MySQL Select (1)
MySQL Select (1)MySQL Select (1)
MySQL Select (1)
 
2. MySQL DataTye Basic
2. MySQL DataTye Basic2. MySQL DataTye Basic
2. MySQL DataTye Basic
 
MySQL Create Table
MySQL Create TableMySQL Create Table
MySQL Create Table
 
Mymysql basic sql
Mymysql basic sqlMymysql basic sql
Mymysql basic sql
 

포인터의기초 (2) - 포인터 사용하기1

  • 1. C언어와 포인터 (1) 포인터의 사용법 "완전학습을 지향하는" NHN NEXT 정호영 나눔고딕 및 나눔고딕코딩 글꼴을 설치해 주세요.
  • 2. 포인터의 용도 1. 원하는 메모리 번지에 직접 값을 쓰기 2. 변수의 동적 할당 3. Call by Reference 4. 배열과 문자열의 조작 5. 구조체의 효율적 사용 등등…
  • 3. 0. void 포인터 이야기
  • 4. void *는 무엇이든 담을 수 있는 그릇입니다. void *ptr; int a = 10; double d = 3.14; ptr = &a; //ok ptr = &d; //ok
  • 5. void 포인터에 * 연산자를 사용하면 어떻게 될까요? void *ptr; double d = 3.14; ptr = &d; //ok printf("%fn", *ptr);
  • 6. void 포인터는 포인티의 타입이 정해지지 않았기 때문에 읽을 수 없습니다. 그럼 어떻게 void 포인터의 포인티 값을 읽을까요?
  • 7. 정답은 캐스팅 (형변환) 입니다. 1. void 포인터를 포인티의 포인터 타입으로 형변환 2. * 연산자를 붙여서 값을 읽는다. 예제 (double *) ptr void *ptr; double d = 3.14; ptr = &d; //ok printf("%fn", *((double *)ptr)); //ok *((double *) ptr)
  • 8. 불편한 void*를 왜 사용하는지는 조금 뒤에…
  • 9. 1. 메모리에 직접 값을 쓰기
  • 10. 메모리의 원하는 번지에 직접 값을 쓰는 경우가 있습니다. 하드웨어를 직접 제어하는 경우, 많이 사용합니다. 예) 0x378 번지의 값이 1이면 USB가 살아있다. char *alive = (char *) 0x378; if (*alive == 1) { //USB가 살아 있구나. 뭘 하지? } else { //USB가 안 살아있음, 다른 일을 하자. }
  • 12. 지난 시간에 우리 마음대로 사용할 수 있는 heap 이라고 하는 공간이 있다고 했습니다. 이 공간을 배정받는 함수 malloc() calloc() 반납하는 함수 free()
  • 13. void *malloc(size_t size); void free(void *ptr); void *calloc(size_t n, size_t size); 우리가 요청한 크기만큼 힙에 공간을 할당해 줍니다. 리턴값은 요청한 공간의 시작주소입니다. free함수는 할당한 메모리를 해제할 때 사용합니다. 할당하고 해제하지 않으면 leak이 발생할 수 있습니다.
  • 14. 예제) int 크기만큼 공간을 할당받고 싶어요. //NAVER cast void * to int * in this case! int *ptr = malloc(sizeof(int)); *ptr = 50; printf("%dn", *ptr); free(ptr);
  • 15. 예제) int 3개만큼 동적 할당을 하고 싶어요. *포인터의 덧셈이 잠깐 나왔습니다. int *ptr = malloc(sizeof(int)*3); int *temp; *ptr = 10; temp = ptr + 1; *temp = 20; printf("%dn", *ptr); //10 printf("%dn", *(ptr + 1)); //?
  • 16. 예제) calloc을 사용해 봅시다. *포인터의 덧셈이 잠깐 나왔습니다. int *ptr = calloc(3, sizeof(int)); int *temp; *ptr = 10; temp = ptr + 1; *temp = 20; printf("%dn", *ptr); printf("%dn", *(ptr + 1));
  • 17. 3. Call by Reference
  • 18. C언어의 먼 선조인 포트란은 함수에 인자를 전달할 때 원본을 그대로 전달했습니다. 아래 언어가 포트란이라면… void foo(int i) { i = i + 10; } main() { a = 100; foo(a); printf("%dn", a); } // 포트란이라면 (오해하지 마세요) // 200 // C니까 100
  • 19. 조금 더 자세한 설명을 위해 용어를 정의합니다. argument: 실제 호출하는 쪽에서는 넘겨주는 변수 parameter: 함수의 정의에 있는 변수 앞쪽에서 parameter: i argument: a 모르는 분이 엄청 많습니다.
  • 20. 중요한 건 C언어는 argument 에서 parameter 로 갈 때 복사본을 전달해 준 다는 사실입니다. 이것을 call by value 라고 합니다. -- return 값도 마찬가지로 복사가 일어납니다.
  • 21. call by value - argument의 값이 바뀌지 않는다. - 복사본을 전달한다. call by reference - argument의 값이 바뀐다. - 원본을 전달한다. call by value는 성능상 문제가 되기도 합니다.
  • 22. 그런데 C 언어에는 call by reference 가 없습니다!! 뭐라고??
  • 23. Java - 일반 변수는 call by value - 배열, 클래스 등 복합 타입 변수는 call by reference - 포인터는 완전히 사라졌다!
  • 24. c++ - 선언에 &를 사용하면 참조 연산자! - c++ 최대의 실수 - 포인터도 여전히 사용할 수 있다. 프로그래머의 욕심은 끝이 없고, 같은 실수를 반복한다.
  • 25. c# = C++ + C++ 기본 골격은 java와 같지만 내 마음대로 선언도 가능 parameter에 ref 키워드 사용하면 call by reference argument에도 반드시 ref 키워드를 사용해야 함
  • 26. C언어에는 call by reference 흉내가 있습니다. call by address 라고 하는 게 더 맞는 표현입니다. 이 때 포인터를 사용합니다!
  • 27. void foo(int *i) { *i = *i + 10; } int main(void) { int a = 100; foo(&a); printf("%dn", a); return 0; } //실행 결과 200
  • 28. int 변수에 대해 call by reference 를 하기 위해서 int * 를 사용했습니다. char 변수의 call by reference를 하려면? double 변수의 call by reference를 하려면? int* 변수의 call by reference를 하려면?
  • 29. int 변수에 대해 call by reference 를 하기 위해서 int * 를 사용했습니다. char 변수의 call by reference를 하려면? char * double 변수의 call by referenc를 하려면? double * int* 변수의 call by reference를 하려면? int **
  • 30. int myalloc(int *ptr, unsigned int size)를 구현합니다. - int 전용 동적할당 함수 - 성공하면 size, 실패하면 -1을 리턴 int myalloc (int *ptr, unsigned int numb) { //implement } int main(void) { int *ptr = NULL; int ret = myalloc(ptr, 1); if (ret == -1) return 1; *ptr = 5054; printf("%dn", *ptr); return 0; }
  • 31. 어떻게 구현하든지 앞의 함수는 틀렸습니다. argument로 전달한 ptr은 값이 바뀌지 않기 때문입니다. int *를 call by reference로 호출하려면 int **를 사용합니다. int myalloc (int **ptr, unsigned int numb) { *ptr = malloc(sizeof(int) * numb); if (ptr) return numb; else return -1; } int main(void) { int *ptr = NULL; int ret = myalloc(&ptr, 1); if (ret == -1) return 1; *ptr = 5054; printf("%dn", *ptr); return 0; }
  • 32. 이중 포인터의 용법1 단일 포인터의 call by reference를 위해
  • 34. C언어의 배열은 90% 정도 포인터랑 닮았습니다. 포인터에도 배열 연산을 그대로 쓸 수 있습니다! int arr[5]; double b[]= {1, 2, 3, 4, 5}; //자동으로 5개가 됨
  • 35. 이 코드를 실행해 보고 알아낸 사실을 토의해 봅시다. int main(void){ int a[5] = {1,2,3,4,5}; printf("%pn", a); printf("%p %dn", &a[0], a[0]); printf("%p %dn", &a[1], a[1]); return 0; }
  • 36. 놀랍게도 배열이름 변수에는 배열의 첫번째 원소의 주소가 들어갑니다! arr = &arr[0] int의 주소를 저장한 변수 = int * 포인터를 배열에 대입해서 쓸 수 있을까요?
  • 37. HULL? int main(void){ int a[5] = {1,2,3,4,5}; int *ptr = a; //not &a, &a[0]도 OK printf("%pn", ptr); printf("%p %dn", ptr, *ptr); printf("%p %dn", ptr + 1, *(ptr +1)); return 0; }
  • 38. HULL? 무언가 수상하지요? int main(void){ int a[5] = {1,2,3,4,5}; int *ptr = a; //not &a, &a[0]도 OK printf("%pn", ptr); printf("%p %dn", ptr + 0, *(ptr + 0)); printf("%p %dn", ptr + 1, *(ptr + 1)); return 0; } int main(void){ int a[5] = {1,2,3,4,5}; printf("%pn", a); printf("%p %dn", &a[0], a[0]); printf("%p %dn", &a[1], a[1]); return 0; }
  • 39. HULL? 포인터가 미쳐 날뛰고 있습니다!! int main(void) { int a[5] = {1,2,3,4,5}; int *ptr = a; printf("%pn", ptr); printf("%p %dn", &ptr[0], ptr[0]); printf("%p %dn", &ptr[1], ptr[1]); return 0; } int main(void) { int a[5] = {1,2,3,4,5}; printf("%pn", a); printf("%p %dn", &a[0], a[0]); printf("%p %dn", &a[1], a[1]); return 0; }
  • 40. 사실 a[i] 는 *(a + i) 랑 완전히 똑같습니다. 사람의 편의를 위해 읽기 쉽게 만들어 준 거랍니다. 이런 걸 syntax sugar 라고 합니다. a[i] = *(a + i) *나중에 다시 나오지만 a->b도 syntax sugar 입니다.
  • 41. 다 아는 산수 한 번 해볼까요? a[3] = *(a + 3) = *(3 + a) = 3[a]
  • 42. int main() { int a[5] = {1,2,3,4,5}; for (int i = 0; i < 5; i++) printf("%dn", i[a]); return 0; } (형~오빠~, 이거 어디가 잘못된 건지 좀 가르쳐 주세요.) 잘못된 건 비뚤어진 너의 마음이다 ㅋㅋ. 죄송합니다. 된다고 절대 사용하면 안 됩니다.