[c언어] pointer , 포인터
- 카테고리 없음
- 2020. 11. 25.
pointer : 주소값을 저장하는 변수 (4 byte) , 간접 변수, 포인터는 1 대 1 방식이다.
가르키는 대상의 따라서 포인터 모양이 달라진다.
만약 int형 포인터를 사용할 경우 int type은 4byte이다.
그러나 갑자기 char를 읽으라고 할 경우 char type은 1byte이므로, 잘못했다가는 char data를 4개를 읽을 수 있는 경우가 발생한다.
데이터 크기에 따라 저장하기 때문에 data mix 혹은 data 손실이 발생하게 된다.
그러므로 pointer를 사용 할때는 가르키는 대상의 타입을 명확히 알아야 한다.
* => []
- 기능
- 오직 주소값만 저장 할 수 있다.
- 내가 지정 한 곳이 아닌 엉뚱한 곳으로 지정하게 되면 Non Type error가 발생한다.
- ★★★ 반드시 초기값을 제대로 해야 한다. 엉뚱한 것을 지정하면 메모리 손실이 일어난다.
- 가르키는 데이터를 읽을 수 있다.
- 메모리를 모두 읽지 않고 가르키는 값만 읽기 때문에 메모리 읽는 속도가 빠를 수 밖에 없다.
- 가르키는 데이터를 바꿀 수 있다.
- 주소 이동을 할 수 있다. (1번의 조건, 초기값을 다시 지정한다.)
- 오직 주소값만 저장 할 수 있다.
- 가르키는 타입 *변수명; (pointer 변수 선언)
- 포인터
#include<stdio.h>
int main() {
int a = 10;
int b = 20;
//포인터 선언
int* p = NULL; // NULL POINTER
//if 를 통해서 포인터가 null일 경우를 선언 할 수 있으므로 중요한 스킬
p = &a; //1. 주소 초기화
//2. 가르키는 데이터를 읽을 수 있다.
printf("2. 가르키는 데이터를 읽을 수 있다. \n");
printf("%d %d %d\n",a, *p, p[0]);
// 주소값 확인해보기
// 포인터는 a를 가르키므로 첫 번재와 두 번째는 주소값이 같다.
// 세번째는 실제 포인터의 주소값이다.
// ★★★ 이 방법은 반드시 구분 할 줄 알아야 한다.
printf("%d %d %d\n", &a, p, &p);
//3. 가르키는 데이터를 바꿀 수 있다.
printf("3. 가르키는 데이터를 바꿀 수 있다. \n");
*p = 50; //1. a = 50 2. *p = 50 3. p[0] = 50 이 세개는 같은 의미이다.
printf("%d %d %d\n", a, *p, p[0]);
//4. 주소 이동
printf("주소 이동");
p = &b;
printf("%d %d %d\n", a, *p, p[0]);
}
응용하기
#include <stdio.h>
int main() {
char name[3][10]; //이름
int score[3][4] = { 0 };
float avg[3] = { 0.f };
int i, j;
//포인터 만들기
char* p_name = *name;
int* p_score = score[0];
float* p_avg = avg;
for (i = 0; i < 3; i++)
{
//이름 입력하기
printf("이름 입력하기 : ");
scanf("%s", p_name);
printf("\n점수 입력하기\n");
for (j = 0; j < 3; j++) {
//점수 입력하기
switch (j)
{
case 0:
printf("국어 점수 : ");
break;
case 1:
printf("영어 점수 : ");
break;
case 2:
printf("수학 점수 : ");
break;
}
scanf("\n%d", p_score +j);
*(p_score + 3) += *(p_score + j);
}
*(p_avg) = *(p_score + 3) / 3.f;
p_name += 10;
p_score += 4;
p_avg++;
}
//초기화 시키기
p_name = *name;
p_score = score[0];
p_avg = avg;
printf("이름\t\t국어\t영어\t수학\t총점\t\t평균\n");
for (i = 0; i < 3; i++)
{
printf("%s\t\t", p_name);
for (j = 0; j < 4; j++)
{
printf("%d\t", *(p_score + j) );
}
printf("\t%f\n", *p_avg );
p_name += 10;
p_score += 4;
p_avg++;
}
return 0;
}
반응형