[c언어] pointer , 포인터

    pointer : 주소값을 저장하는 변수 (4 byte)  , 간접 변수, 포인터는 1 대 1 방식이다.

     

     

    가르키는 대상의 따라서 포인터  모양이 달라진다.

     

    만약 int형 포인터를 사용할 경우 int type은 4byte이다.

    그러나 갑자기 char를 읽으라고 할 경우 char type은 1byte이므로, 잘못했다가는 char data를 4개를 읽을 수 있는 경우가 발생한다.

     

    데이터 크기에 따라 저장하기 때문에 data mix 혹은 data 손실이 발생하게 된다.

    그러므로 pointer를 사용 할때는 가르키는 대상의 타입을 명확히 알아야 한다.

     

     

     

    *  => [] 

     

     

    1. 기능
      1. 오직 주소값만 저장 할 수 있다.
        1.  내가 지정 한 곳이 아닌 엉뚱한 곳으로 지정하게 되면 Non Type error가 발생한다.
        2.  ★★★ 반드시 초기값을 제대로 해야 한다. 엉뚱한 것을 지정하면 메모리 손실이 일어난다.
      2. 가르키는 데이터를 읽을 수 있다.
        1.  메모리를 모두 읽지 않고 가르키는 값만 읽기 때문에 메모리 읽는 속도가 빠를 수 밖에 없다.
      3. 가르키는 데이터를 바꿀 수 있다.
      4. 주소 이동을 할 수 있다. (1번의 조건, 초기값을 다시 지정한다.)
    2. 가르키는 타입 *변수명; (pointer 변수 선언)
      1. 포인터
    #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;
    }

    반응형

    댓글

    Designed by JB FACTORY