개발새발 블로그

C언어 기초 / 포인터 본문

학교공부/자료구조

C언어 기초 / 포인터

복지희 2023. 9. 18. 13:37

포인터는 주소값을 참조해줄 때 사용한다.

int main(void) {
	int a = 1;
	int* b = &a;
	printf("주소값은 %d\n", &a);
	printf("주소값은 %d\n", b);
	printf("값은 %d\n", *b);
}

결과값이다. (주소는 %d 가 아니라 %p를 써줘야 정확하긴 하다!!)

포인터(*) 포인터 변수를 사용할때 쓰임
간접 참조 연산자(*) 선언된 포인터 변수가 가리키는 real 변수값을 지정

 

int main(void) {
	int a = 1;
	int* b = &a;
	printf("주소값은 %p\n", &a);
	printf("주소값은 %p\n", b);
	printf("값은 %d\n", *b);

	*b = 2;
	printf("a = %d, b = %d", a, *b);
}

포인터를 사용해서 주소전달이 되었기 때문에, b의 값을 바꾸면 a의 값도 자동으로 바뀐다.

 


<포인터의 사용처 - swap 함수>

#include <stdio.h>

void swap(int x, int y) {
	int temp;
	temp = x;
	x = y;
	y = temp;
}

int main(void) {
	int x = 1;
	int y = 2;
	swap(x, y);
	printf("x = %d y = %d", x, y);
}

포인터를 사용하지 않고 이렇게 작성하게 되면 결과값으로 

x = 1 y = 2

이렇게 나온다.

swap 함수를 거쳐도 swap 함수 내에서만 변수들의 값이 바뀌고 main 함수에서는 바뀌지 않기 때문이다.

그렇기 때문에 포인터를 사용해주면 편하다.

++) 배열은 배열 자체가 포인터이기 때문에 함수 내에서 돌려도 함수 내의 결과값이 그냥 전역으로 저장된다!

 

#include <stdio.h>

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

int main(void) {
	int x = 1;
	int y = 2;
	swap(&x, &y);	//주소값으로 넘겨주기
	printf("x = %d y = %d", x, y);
}

이렇게 포인터로 넘겨주면 주소의 값을 인자로 받으며

메모리에서 값을 스왑한다면

원하는 결과값인 x=2 y=1 을 돌려받을 수 있다.

 

 


<char 배열 사용해서 접근해보기>

int main(void) {
	char arr[6] = "hello";
	char* ptr = &arr[0];
	char* ptr2 = &arr[1];

	printf("첫번째 주소값은 %p\n", ptr);
	printf("두번째 주소값은 %p\n", ptr2);
	printf("첫번째 값은 %c\n", *ptr);
	printf("두번째 값은 %c\n", *ptr2);
}

결과 사진이다. 

 

char는 하나당 1byte씩 차지하기 때문에 다음 인덱스의 배열과는 1byte 만큼만 차이가 난다.

 

int main(void) {
	char arr[6] = "hello";
	char* ptr = &arr[0];

	printf("값은 %c\n", *ptr+1);
}

이렇게 작성하면 결과값으로 i가 나온다.

h 다음의 알파벳이 i이기 때문이다.

 

주소값으로 hello의 e를 출력하고 싶으면 

int main(void) {
	char arr[6] = "hello";
	char* ptr = &arr[0];

	printf("값은 %c\n", *(ptr+1));
}

괄호를 넣어주면 문제 해결 완료!