본문 바로가기
관/솔직한 c 언어 공부

C언어 포인터변수란? (2020ver).

by 4차원 박스 2020. 7. 31.

이번엔 C언어의 포인터변수, call by value와 call by reference와 call by pointer를 알아본다. 포인터가 어렵다고 하지만 다 엄살이다. 생각보다 간단하니 천천히 읽어보자!

<포인터 변수와 일반 변수와의 차이점>

포인터 변수

c언어가 컴퓨터친화적인 특성을 지닌 이유이다 포인터를 통해 메모리에 직접 접근이 가능하다.

 

변수와 메모리를 살핀다.

 

우선 메모리 블록이란 1바이트를 하나의 블록으로 정해놓고 각각 주소값을 지닌다.

 

문자변수는 1바이트 즉 블록 하나를

숫자변수는 4바이트 즉 블록 4개에 결쳐서 메모리에 저장을 한다.

이때 변수는 블록의 시작하는 부분에 할당되어 있다고 약속한다.

 

이때 메모리의 주소값 또한 정수이며 이것도 변수에 저장이 가능하며

이러한 것을 위해 마련된 변수를 포인터 변수라고 한다.

 

즉 포인터 변수란 메모리의 주소 값을 저장하기 위한 변수이다.

 

포인터변수 선언 방법

type * name ; 이런 구조이다.

 

이러한 전체적인 포인터변수에 대한 설명이 일반 변수와의 차이라고 볼 수 있다.

 

포인터 변수는 변수의 주소 값을 저장하고

변수는 값을 저장한다 라고 생각한다.

그것이 변수니까“

 

이번엔 저번 포스팅과 합쳐서 포인터와 배열을 본다. 

포인터 변수 이름과 배열 변수 이름을 서로 혼용해서 사용할 수 있는지 예시로

한번 보자.

int main()

{

int num = 10;

int *pnum = &num;

printf("%d \n",num);

printf("%d",pnum);

 

return 0;

}

과 같이 사용하는 혼용이라면 당연히 문제가 없다.

 

하지만

 

int main()

{

int num = 10;

int *num = &num;

printf("%d \n",num);

 

return 0;

}

 

이런 방식으로 포인터변수의 이름과 일반 변수의 이름을 같게하여 사용하는 것은 에러를 일으킨다.

 

* 연산자는 포인터가 가리키는 메모리 공간에 접근할때 사용하는 연산자이기 때문이다.

딱 와닿는 이해로는 배열의 이름과 포인터가 비슷한 기능을 한다고 생각하면 된다.

배열의 이름과 변수의 이름이 같으면 에러가 나는것과 같이 말이다.

 

<call by value와 call by reference와 call by pointer 란?>

call by value

복사본이 전달된다.

기본적으로 지원하는 방식으로 함수에서 값을 복사해 전달하는 방식이다.

인자로 전달되는 변수를 함수의 매개변수에 복사한다.(이거로 함수의 변수와 구별이 가능한 이유이다.)

 

call by reference

원본이 전달된다.

함수에서 값을 전달하는 대신 주소값을 전달하는 방식이다.

c에서는 이런 방식을 공식적으로 지원하지 않으나 결과적으로

call by address를 이용하여 call by reference 같이 사용할 수 있다.

포인터에서 주소를 넘겨주는 것은 이것이 아니다. 포인터 자체가 값을

넘기는 것 이므로 call by value 이다.

 

call by pointer

함수 복사된 인수의 주소를 인수를 전달하는 방법.

함수 내에서 주소는 호출에 사용 된 실제 인수에 액세스하는 데 사용됨.

이는 매개 변수의 변경 사항이 전달 된 인수에 영향을 준다는 것을 의미함.

댓글