내가 헷갈리는 포인터 파트 정리!
2022. 5. 23. 17:36ㆍC언어
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
'C언어' 카테고리의 다른 글
구조체, 포인터, 동적할당 문제 (0) | 2022.08.12 |
---|---|
배열과 포인터의 관계 (0) | 2022.05.23 |
c언어 - 테트리스 만들기 초기 설정,4 블럭 낙하 (0) | 2022.02.12 |
c언어-테트리스만들기3, 테트리스 블럭만들기, 다차원배열 (0) | 2022.02.09 |
c언어 -테트리스 만들기2 위치 지정하기, 키보드로 움직이기 (0) | 2022.01.28 |