본문 바로가기

포인터

(4)
function - 포인터 인자, 배열 인자 포인터를 배우면서 포인터가 어디에 쓰이는지에 대한 의문이 많이 들었다. 그래서 이번엔 함수에서 포인터를 어떻게 사용하는지에 대해서 공부할 것이다. 먼저, 단순한 형태의 함수의 예를 들어보자. #include void val_test_f(int i) { i = 20; } int main() { int i = 10; val_test_f(i); printf("함수 호출 후 i값 : %d ", i); return 0; } 위의 예와 같이 return을 사용하지 않고 main 함수에서 정의한 i의 값을 피호출 된 함수(val_test_f)에서 바꿀 수 없다. 조금 더 구체적으로 C언어의 메모리 구조를 통해서 이해해보자. 메모리 구조 프로그램을 실행시키기 위해서 메모리 공간이 필요한데 스택(Stack), 힙(Hea..
포인터의 이해(3) - 포인터와 1차원, 2차원 배열 / 더블포인터 / 배열의 포인터 / 포인터 배열 1차원 배열과 포인터 배열 arr를 출력하면 arr[0]의 주소값이 출력된다고 했다. 또한, [] 연산자는 * (arr + i) 로 바뀌어서 []안에 있는 숫자에 해당하는 위치의 값을 출력한다고 배웠다. 다른 int* 포인터가 이 배열을 가리킬 수 있는지 확인해보자. #include int main() { int arr[] = { 1,2,3,4,5 }; int* p ; p = &arr[2]; printf("arr : %d \n", arr[1]); printf("arr2 : %d ", p[1]); return 0; } int 형을 가리키는 포인트 변수 p를 정의하고, p = &arr[2]; 를 통하여 p에 arr[2]의 주소값을 대입하였다. 그리고 p[1]를 실행하면 *(p + 1) 로 바뀌어서 arr[3..
포인터의 이해(2) - 상수 포인터, 포인터의 덧셈과 뺄셈, 배열과 포인터의 관계, [] 연산자 상수포인터 const 키워드를 붙여 데이터를 상수(바뀌지 않은 값)로 만들 수 있다. 포인터 또한, const 키워드를 붙여 상수로 만들 수 있다. 예를 들어보며 이해해보자 #include int main() { int a; int b; const int* p = &a; p = &b; //올바른 문장 *p = 3; //올바르지 않은 문장 return 0; } 다음 예시는 컴파일을 했을 경우 에러가 난다. const int* 의 의미는 const int 형 변수를 가리킨다는 의미가 아니고, int 형 변수를 가리키는데 그 값을 절대로 바꾸지 말라는 의미이다. 즉, p는 int형 변수를 가리키고 있고 const가 붙어있어서 p가 가리키는 변수의 값이 바뀌면 안되는 것이다. 여기서 변수 a는 값이 자유롭게 바..
포인터의 이해(1) - *, & 연산자의 의미 C언어를 공부하게 되면서 C언어의 꽃인 포인터를 정리해보았다. 먼저, 포인터를 정리하기 전에 메모리의 주소에 대해서 이해해보자. 메모리 주소 데이터들은 특정 메모리 공간에 저장되어 있는데 공간 하나당 보통 1 바이트이다. 예를 들어, int형 변수를 정의하면 4바이트의 크기를 가지고 있어 4칸을 차지하게 된다. int a = 1234; 이처럼 int 변수 a를 정의하면 해당 데이터가 저장되는 방의 주소(0x134232)가 붙여진다. 이 주소를 통해서 데이터를 가져오게 된다. 다시 말해서, 변수는 운영체제로부터 자신의 크기만큼 각 메모리를 할당 받는다. 그리고 그 영역에 값을 저장하여 사용한다. 그리고 각 메모리는 바이트 단위마다 주소를 가지고 있고, 그 주소를 통하여 해당 변수의 값을 가져올 수 있다. ..