(수근수근)

[2] C 메모리와 포인터 본문

C++

[2] C 메모리와 포인터

InformationFarm 2020. 5. 19. 14:41

자바만 배운 내가  C++을 처음 접했을때 다들 포인터개념만 더 하면된다고 했다.

(음 물론 아니다... ㅋㅋㅋ)

 

포인터란?

메모리에 있는 데이터의 주소

포인터를 사용하는 이유

  • 데이터 전체를 복사하는 대신, 포인터를 전달해도 되기 떄문,
  • 두코드가 각각의 사본이 아니라 하나의 원본 데이터에서 작업하고 싶기 때문

우리가 무언가 정보를 줄 때도 엄청나게 많은 데이터가있는 사이트를 url만 보내주는 것처럼 포인트도

주소를 제공하여 원하는 정보를 그 곳에서 찾을 수 있게 한다.

 

 메모리에 대해서

메모리를 알아야 포인터가 무엇인지 알 수 있다!

우리가 코드에서 변수를 정의하면 보통 컴퓨터는 메모리에 저장한다고 흔히 말한다.

 

main()함수는 컴퓨터의 stack이라고 불리는 메모리영역에 저장한다.

함수 밖에서 정의하면 전역메모리 영역에 저장한다.

(=함수 안에서 정의한 변수는 스택 / 함수 밖에서 정의한 변수는 전역변수)

 

C에서 메모리의 주소를 알고 싶으면 변수이름 앞에 &(주소연산자)을 넣어주면된다.

 

따라서 각각 다른 함수에 변수에 값을 바꾸면 사본으로 만든 지역변수만 변화하지만

주소 포인터를 사용해서 전달하면 주소의 값이 바뀌기 때문에 변수를 바꿀 수 있다.

 

메모리 포인터 사용하기

메모리 포인터를 사용하고 싶으면 3가지를 기억하자!

  1. 변수의 주소를 가지고 온다
  2. 주소에 있는 값을 읽는다
  3. 가지고 온 주소에 있는 값을 바꾼다.
int x = 4; 
int *addressA = &x;	//1)
int value_A = *addressA; //2)
*addressA = 100; //3)

역참조 연산자(*) : 메모리 번지에 있는 내용을 읽게 함 / 메모리 번지의 값을 쓸 수도 있다. 

 

배열변수와 포인터

배열변수는 메모리에 있는 배열의 시작번지를 가리키는 포인터로 사용된다..

char name[] = "soon will be good";
printf("%p는 뭐일까용???", name);

 

 여기서 sizeof(name)하면 name의 길이가 나올 것 같지만!

name포인터의 크기를 알려준다!

따라서 name은 배열변수의 주소가 저장되어있지 값이 저장되어있는 것이 아니다!

 

'C++' 카테고리의 다른 글

MFC 함수 정리  (0) 2020.06.22
[C++] INI 파일 읽고 쓰기  (0) 2020.05.21
[1] C 시작하기  (0) 2020.05.19
[C++] #define 대신 const enum inline  (0) 2020.05.18
[C++] 기초 관련 용어  (0) 2020.05.18
Comments