Study/C

포인터 [part1]

MWP 2017. 1. 17. 16:04

1. 함수의 인자로 배열 전달

#include <stdio.h>
/* 함수의 인자로 배열 전달*/
 
void func(int *arr, int len) {
    // 매개변수로 배열의 포인터를 받음
    // int arr[] 로도 선언가능
    for (int i = 0; i < len; i++) {
        arr[i] = 100; // == *(arr+i)
        // 메모리 주소값을 가르키는 포인터이므로 값 변경 가능
    }
    for (int i = 0; i < len; i++) {
        printf("arr[%d] : %d \n", i, *(arr + i));
    }
}
 
void main() {
    int arr[] = { 1,2,3,4,5 };
    int len = sizeof(arr) / sizeof(int);
    // main 내에서는 sizeof(arr) 이 20 이지만
    // 매개변수로 전달된 포인터 arr 은 사이즈가 4이므로
    // 길이 정보를 같이 전달해야함
    func(arr,len);
}


2. Call by Reference 를 이용한 Swap

#include <stdio.h>
/* Call by Reference Swap */
 
void swap(int *n1, int *n2) {
    // 메모리 주소를 통해 접근해 n1과 n2 의 실제값을 서로 swap
    int temp = *n1; // n1의 값을 temp 변수에 임시 저장
    *n1 = *n2; // n1 의 값을 n2 의 값으로 변경
    *n2 = temp; // temp 에 임시로 저장한 n1 의 값을 n2 에 저장
}
 
void main() {
    int n1 = 1;
    int n2 = 5;
 
    printf("n1= %d n2= %d \n", n1, n2);
    swap(&n1, &n2); // n1 과 n2 의 값을 바꿈
    printf("n1= %d n2= %d \n", n1, n2);
}


2. 포인터 대상의 const 선언
#include <stdio.h>
/* 포인터 대상의 const 선언 */
void main() {
    int num = 20;
    const int *ptr = &num; // ptr을 참조해 값을 변경하는것을 허용하지않는다
    int const *ptr2 = &num; // ptr2가 참조하는 주소값을 변경하는것을 허용하지 않는다
}