내가 헷갈리는 포인터 파트 정리!

2022. 5. 23. 17:36C언어

728x90

포인터 : 변수의 메모리 주소를 저장하는 변수

* : 간접 참조 연산자

& : 주소연산자

 

이 변수가 포인터라는 것을 명시해 주기위해 선언할 때 *를 붙인다.

필자는 간접 참조 연산자(*)와 선언 시 사용하는 *가 헷갈렸다. 

생각한 결과 : 선언 시 사용하는 * 와 간접 참조 연산자는 관계가 없다.

 

# include <stdio.h>

int main(void)
{
	int a = 4;;
	int b = 3;
	int* pa = a;
	int* pb = &b;
	printf("%d\n", pa);
	// printf("%d\n", *pa); -> 포인터 pa는 4라는 주소를 가리키고 *pa는 주소가 4인 메모리의 값을 나타낸다.
	printf("%d\n", pb);
	printf("%d\n", *pb);

	return 0;
}

 

 

 

주소 : 변수에 할당된 메모리 저장 공간의 시작 주소 값 자체

포인터 : 그 값을 저장하는 또 다른 메모리 공간

 

여기서 주소는 상수이고 포인터는 변수라는 것을 명심해야한다!!

int main(void)
{
	int a = 3;
	int b = 2;
	int* pa;
	int* pb;
	pa = pb = &a;
	// &a = &b; -> 주소는 상수이기때문에 대입 연산자 왼쪽에 올 수 없습니다.

	return 0;
}

 

 

포인터 활용 예제1)

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

int main(void)
{
	int a = 3;
	int b = 2;
	swap(&a, &b);

	printf("a: %d\n", a);
	printf("b: %d\n", b);
	return 0;
}

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

 

=> 포인터를 사용해 주소와 연결해준 것이 포인트!

 

 

포인터를 활용한 예제2)

#include <stdio.h>

void Sum(int* ko, int* ma, int* en, int* total) {
	*total = *ko + *ma + *en;
}

void Avg(int total, double* avg) {
	*avg = total/3;
	
}

void Grade (double avg, char* grade) {
	if (avg >= 90) {
		*grade = 'A';
	}
	else if (avg >= 80) {
		*grade = 'B';
	}
	else if (avg >= 70) {
		*grade = 'C';
	}
	else if (avg >= 60) {
		*grade = 'D';
	}
	else {
		*grade = 'F';
	}
}


int main() {
	
	int total=0, ko, ma, en;
	double avg = 0;
	char grade =0;
	
	printf("국어, 수학, 영어 입력 : ");
	scanf("%d %d %d", &ko, &ma, &en);

	Sum(&ko, &ma, &en, &total);
	printf("총합 : %d\n", total);

	Avg(total,&avg);
	printf("평균 : %.2lf\n", avg);

	Grade(avg,&grade);
	printf("등급 : %c\n", grade);
	
	return 0;
}

포인트 선언 방법 : '저장할 공간의 자료형 * 변수명'의 형식으로 작성할 것!!

728x90