포인터

포인터는 개인적으로 매우 다루기 어려운 기능 중 하나라고 생각한다.

문자열 포인터 활용

c언어의 문자열은 배열 형태로 저장되므로 [ ]를 통해 인덱스 접근이 가능하다.

#include <stdio.h>

int main()
{
	// 문자열 포인터

	// 예제 따라서 출력해보기
	char* ptr1 = "Hello, World!";
	printf("%s\\n", ptr1);

	// for문으로도 될까?
	for (int i = 0; i < 5; printf("%c", ptr1[i++]));
	printf("\\n");
	// 된다 !

	// 아래 코드는 실행 시 오류가 발생함.
	
	/*
	for (int i = 0; i < 5; printf("%s", ptr1++));
	printf("\\n");
	*/

	// 문자열 포인터의 경우 값을 수정할 수 없음.
	//
	// 따라서 아래 코드도 에러가 발생함

	/*
	ptr1[1] = 'h';
	printf("%s\\n", ptr1);
	*/
}

문자열 또한 배열의 일종이므로 문자열을 나타내는 포인터를 ++ 시켜주면 에러가 발생한다.

포인터를 사용한 값 스왑

자세한 내용에 대해 알고싶다면 Call by Value와 Call by reference에 대해 공부하는 것이 좋다.

파이썬처럼 return a,b 와 같이 2개를 리턴해주는 기능이 c언어에는 존재하지 않으므로 다음과 같이 스왑해줄 수 있다.

전달인자로 전달 할 때 메모리 주소를 넣어주기 위해 &를 사용하는 것을 볼 수 있다.

앞에 붙는 *와 &의 역할을 파악하는 것이 중요하다.

#include <stdio.h>

int swap(int *x, int *y);

int main()
{
	int x1 = 10;
	int y1 = 20;

	printf("스왑 하기 이전의 x1 : %d , y1 : %d\\n", x1, y1);
	swap(&x1, &y1);
	printf("스왑 이후의 x1 : %d , y1 : %d\\n", x1, y1);

}

int swap(int *x, int *y)
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}