본문 바로가기
SW/C C++

[C/C++] 포인터 연습1

by 17Hyuk 2022. 9. 20.

포인터가 매번 약한거 같아서 연습을 했다.

 

포인터 기본

#include <stdio.h>

int main()
{

    /*
    
    & : 주소 출력 (ex : 6487580)
    
    포인터 변수
    ㅇ 변수명 앞에 * 을 넣어서 만듬
    ㅇ 포인터 변수는 주소를 담는 역활
    ㅇ *p = 5 이런식으로 포인터가 가르키는 변수의 값을 변경 가능함

    */


    int a = 10;
    int *p = &a;            // 포인터 p는 a의 주소를 가르킴

    printf("a=10 대입\n");
    printf("a : %d \n", a);             // a값 출력
    printf("&a : %d \n", &a);           // a의 주소 출력
    printf("p : %d \n", p);             // p값 출력
    printf("*p :%d \n", *p);            // p가 가르키는 주소의 값을 출력

    a = 20;
    printf("\n");
    printf("a=20 으로 업데이트\n");
    printf("a : %d \n", a);             // a값 출력
    printf("&a : %d \n", &a);           // a의 주소 출력
    printf("p : %d \n", p);             // p값 출력
    printf("*p :%d \n", *p);            // p가 가르키는 주소의 값을 출력

    *p = 5;
    printf("\n");
    printf("*p=5 으로 업데이트\n");
    printf("a : %d \n", a);             // a값 출력
    printf("&a : %d \n", &a);           // a의 주소 출력
    printf("p : %d \n", p);             // p값 출력
    printf("*p :%d \n", *p);            // p가 가르키는 주소의 값을 출력


    return 0;
}

 


그 다음으로는 포인터의 기본이라고 할 수 있는 swap 함수를 구현해 봤다

#include <stdio.h>

void swap_no_pointer(int x, int y)
{
    int tmp = x;
    x = y;
    y = tmp; 
}

void swap_use_pointer(int *x, int *y)       // 매개변수를 포인터로 사용할 경우 &a 이런식으로 주소를 넣어주면됨
{
    int tmp = *x;       // 변수 tmp 에 x가 가르키는 값을 넣음
    *x = *y;            // x가 가르키는 값에 y가 가르키는 값을 넣음
    *y = tmp;           // y가 가르키는 값에 변수 tmp의 값을 넣음
}

int main()
{
    int a = 10;
    int b = 20;

    printf("스왑 전\n");
    printf("a : %d, b : %d\n\n", a, b);

    swap_no_pointer(a, b);

    printf("포인터 없는 스왑 후\n");
    printf("a : %d, b : %d\n\n", a, b);     // call by value 이기 때문에 값이 변하지 않음


    swap_use_pointer(&a, &b);

    printf("포인터 있는 스왑 후\n");
    printf("a : %d, b : %d\n\n", a, b);     // call by reference 이기 때문에 값이 변함


    return 0;
}

 


다음으로는 포인터의 친구인 배열

#include <stdio.h>

int main()
{

    // 배열의 경우 주소가 연속임 따라서 포인터와 긴밀한 관계


    int arr[] = {1, 2, 3, 4};	// 배열선언 
    

	
    printf("arr 주소 출력 <= 배열의 주소는 0번째 주소와 동일하다!(&arr == &arr[0])\n");
    printf("&arr : %d\n", &arr);
    printf("\n");


	// 인덱스로 접근 
    printf("index를 이용해서 출력\n");
    for(int i=0; i<4; i++)
    {
        printf("arr[%d] : %d ", i, arr[i]);
        printf("&arr[%d] : %d\n", i, &arr[i]);
        
    }
   
 	printf("\n");

    // 포인터로 접근 

    int *p = &arr[0];
	printf("pointer를 이용해서 출력(*p = &arr[0])\n");
	for(int i=0; i<4; i++)
	{
		printf("*(p+%d) : %d ", i, *(p+i));		// 32비트 이므로 4바이트씩 증가한다 
        printf("p+%d : %d\n", i, p+i);
	}




    return 0;
}


다음으로는 동적배열을 이해하기 위해 총점과 평균을 받는 프로그램을 만들었다.

#include <stdio.h>
#include <stdlib.h>     // malloc 사용시 필요

int main()
{

    // 임의의 인원을 받아서 총점, 평균 구하는 프로그램 
	
	int total_person = 0;
	int sum = 0;
	printf("총 인원\n");
	scanf("%d", &total_person);
	
	int* p = (int *)malloc(sizeof(int)*total_person);	// 메모리할당 

	for(int i=0; i<total_person; i++)
	{
		printf("\n%d 번째 : ", i);
		scanf("%d", (p+i));				// scanf의 경우 주소가 필요한데 포인터의 경우 주소 그자체이므로 이런식으로 대입 
		sum += *(p+i);
	}


	printf("\n총점 : %d",sum);
	printf("\n평균 : %.2f", (float)sum/(float)total_person);	
    return 0;
}

 

'SW > C C++' 카테고리의 다른 글

[C/C++] 구조체1  (0) 2023.01.08
[C/C++] 포인터 문자열  (0) 2023.01.07
[C/C++] Bubble Sort  (0) 2023.01.07
[C/C++] 재귀함수  (1) 2023.01.07
[C/C++] 포인터 연습2  (0) 2022.09.21

댓글