포인터와 const


const는 변수를 상수화 시키는 키워드다.

변수를 상수화 시킨다는 말은 변수의 값이 변경 되지 않게 한다는 뜻이다.

한번 초기값이 설정된 변수 값은 변수 사용 범위 내에서 계속 변하지 않는다.

포인터에서 const는 두 가지 의미를 부여 할 수 있다.

하나는 포인터가 가리키는 값을 상수화 하는 것이고 다른 하나는 포인터 변수값 즉 주소 값을 상수화 시키는 것이다.



포인터가 가리키는 값 상수화 방법


결론 부터 보자

int value = 10;

const int *a = &value;


int 앞에 const가 선언되면 포인터가 가리키는 변수가 상수가 되어 아래와 같은 동작을 한다.


int value = 10;

const int *a = &value;

*a = 30; //오류 발생

value = 30; // 변경 가능


value 변수값을 직접 변경이 가능하나 포인터의 값을 변경 하려고 하면 오류가 발생한다.



포인터 상수


결론 부터 보자

int value = 10;

int value2 = 20;

int const *a = &value;


int 뒤에 const가 선언되면 포인터가 상수가 되어 아래와 같은 동작을 한다.


int value = 10;

int value2 = 20;

int * const a = &value;

a = &value2; //오류 발생

*a = 30; // 변경 가능


포인터가 가리키는 value 변수값을 포인터값을 통해 변경이 가능하나 포인터를 변경 하려고 value2의 주소값을 대입하면

오류가 발생한다.





#include <stdio.h>


int main()

{

int value = 10;

int value2 = 20;

int * const a = &value;

const int *b = &value;


//포인터 상수 결과

//=======================================

a = &value2; // 오류 발생 (1)

*a = 30; // 변경 가능

//=======================================


//포인터가 가리키는 값 상수 결과

//=======================================

*b = 30; //오류 발생 (2)

value = 30; // 변경 가능

//=======================================

}


위의 예제를 컴파일 하면 다음과 같은 오류가 발생 한다.


오류 발생 (1) ---> error C3892: 'a' : const인 변수에 할당할 수 없습니다.

 오류 발생 (2) ---> error C3892: 'b' : const인 변수에 할당할 수 없습니다.


반응형

'프로그램 > C' 카테고리의 다른 글

[C] 구조체 배열과 포인터  (0) 2017.07.31
[C] 구조체  (0) 2017.07.24
[C] Call-By-Value와 Call-By-Reference  (0) 2017.07.22
[C] 포인터와 배열  (0) 2017.07.19
[C] 시간차이 구하기 ( millisecond 까지.. )  (0) 2017.07.16

CallByValue와 CallByReference


함수를 호출할 때 필요한 경우 인자값을 전달해줄 때가 있다.

인자값을 전달 할 때 2가지 방식이 존재 한다. 

값을 복사하여 전달 하거나 참조값을 넘겨주는 방식인데 이것을 각각

Call-By-Value와 Call-By-Reference 라 한다.



Call-By-Value


각각에 대해 자세히 살펴 보자.

값을 복사 해서 인자 값을 전달 하는 것은 아래와 같다.


#include <stdio.h>


void callByValue( int value )

{

value += 2 ;

}

int main()

{

int i= 5;


callByValue(i);

printf( "callByValue -> i= %d\n", i);
}



main에서 i=5이다.

callByValue를 호출 할 때 i를 인자 값으로 넘겨 주면 함수 인자 value에 i의 값이 복사 된다.

그러므포 callByValue 함수의 인자 값 value는 5가 되며 함수 안에서 아무리 value 값을 바꿔도

main 함수의 i 값에 영향을 미치지 않는다.


위의 프로그램을 수행하면 함수안에서 2를 더했는데도 main의 i 값에는 영향을 받지 않아

printf의 결과는 i 값은 초기값 5 그대로 출력이 된다.




Call-By-Reference


이번에는 함수의 인자를 참조 값으로 전달하는 예를 살펴 보도록 하겠다. 


#include <stdio.h>


void callByReference( int *value )

{

*value += 2;

}


int main()

{

int i= 5;


callByReference(&i);

printf( "callByReference -> i = %d\n", i );

}



callByReference 함수가 정의 된 것을 보면 포인터로 값을 받도록 되어있다.

이말을 callByReference를 호출 할 때 값을 주는 것이 아닌 주소 값을 전달을 받는다.


callByReference( &i ); 부분을 보면 i 앞에 &가 있으며 이 뜻은 i의 주소 값이라는 의미다.

callByReference 함수안의 인자 value는 main 함수의 i와 동일한 주소를 가리키고 있다는 뜻이다.

*value += 2; 를 수행하면 "value가 가리키는 i의 값을 2를 더해줘" 라는 뜻이 되며

함수안에서 value 값이 변경 되면 i의 값이 바뀐다.


위의 프로그램을 수행하면 함수안에서 *value 즉 value가 가리키는 값에 2를 더한 것이 되어 

main의 i 값에는 영향을 받게 되어 printf의 결과는 i 값은 초기값 5에 2를 더한 값인 2가 출력된다.



반응형

'프로그램 > C' 카테고리의 다른 글

[C] 구조체  (0) 2017.07.24
[C] 포인터와 상수(const)  (0) 2017.07.23
[C] 포인터와 배열  (0) 2017.07.19
[C] 시간차이 구하기 ( millisecond 까지.. )  (0) 2017.07.16
[C] 포인터 자료형  (0) 2017.07.13

포인터와 배열


배열은 여러개의 값을 담을 수 있는 변수로써 각 값마다 주소 값을 가지고있다.

그렇기 때문에 포인터로 각 주소에 접근을 하여 값을 얻어 올수 있는데

이번 설명에서 그 방법에 대해 설명 하도록 하겠다.



포인터와 배열


다음과 같은 5개의 값을 가지고 있는 배열이 있다.

포인터로 각 값을 접근 하고 싶으면 어떻게 해야 할까?


int arr[5] = { 3, 7, 12, 24, 51 };

    int* ptr = NULL;


아래 답을 보기 전에 고민을 해보자..

....


ptr = &arr[0];


그렇다면 ptr이 24를 가리키려면 어떻게 바꿔야 할까?

...


ptr = &arr[3];

printf( " ptr 값 = %d, arr[3] 값 = %d \n", *ptr, arr[3] );


위의 printf을 실행해 보면 같은 값이 나오는 것을 확인 할 수 있다.


ptr = arr;

위의 ptr의 값은 무엇을 나타 낼까?

배열의 이름은 배열의 첫 번째 공간을 주소 값을 나타낸다. 

따라서 ptr이 가리키는 값은 arr 배열의 첫 번째 값인 3이다.


ptr = arr; // ptr = &arr[0] 과 같다.


전체 예제는 다음과 같다.


#include <stdio.h>


int main()

{

int arr[5] = { 3, 7, 12, 24, 51 };

int* ptr = NULL;


ptr = arr;


printf( " arr의 값=%d \n", *ptr );


ptr = &arr[0];


printf( " arr의 값=%d \n", *ptr );


ptr = &arr[3];


printf( " ptr 값 = %d, arr[3] 값 = %d \n", *ptr, arr[3] );


}



반응형

'프로그램 > C' 카테고리의 다른 글

[C] 포인터와 상수(const)  (0) 2017.07.23
[C] Call-By-Value와 Call-By-Reference  (0) 2017.07.22
[C] 시간차이 구하기 ( millisecond 까지.. )  (0) 2017.07.16
[C] 포인터 자료형  (0) 2017.07.13
[C] 포인터 기초  (0) 2017.07.06

시간차 구하기


gettimeofday 함수를 활용하여 시간차이를 구하는 방법을 살펴 보겠다. 

참고로 해당 함수는 windows에서 동작하지 않고 unix, linux 환경에서 동작한다.



포인터의 자료형


아래와 같이 해더를 추가한다.


#include <time.h>


위의 해더에는 아래와 같은 구조체가 존재하며 해당 구조체는 gettimeofday 호출시 필요하다.

  struct timeval {

        time_t          tv_sec;         /* seconds */

        suseconds_t     tv_usec;        /* and microseconds */

  };


이제 전체 시간 구하는 전체 예제를 확인해 보겠다.



#include <stdio.h>

#include <time.h>


int main()

{

struct timeval startTime, endTime, gepTime;


gettimeofday( &startTime, NULL );


sleep(1);


gettimeofday( &endTime, NULL );


gepTime.tv_sec = endTime.tv_sec - startTime.tv_sec;

gepTime.tv_usec = endTime.tv_usec - startTime.tv_usec;

if ( gepTime.tv_usec < 0 )

{

gepTime.tv_sec = gepTime.tv_sec - 1;

gepTime.tv_usec = gepTime.tv_usec + 1000000;

}


printf("ellapsed time [%02d.%02d] second\n", gepTime.tv_sec, gepTime.tv_usec);

}



반응형

'프로그램 > C' 카테고리의 다른 글

[C] Call-By-Value와 Call-By-Reference  (0) 2017.07.22
[C] 포인터와 배열  (0) 2017.07.19
[C] 포인터 자료형  (0) 2017.07.13
[C] 포인터 기초  (0) 2017.07.06
[C] 배열 사용법  (0) 2017.03.22

+ Recent posts