const char * / char * const / char const * 차이


함수 원형을 보다보면 인자에 const 가 붙는 경우가 있다.


대표적인 예로 printf 


#include <stdio.h>

int printf(const char *format, ...);

// 리턴값 : 출력에 성공한 문자 수

 


그리고 execl과 execv


#include <unistd.h>


int execl (const char * pathname, const char * arg0, ..., /* (char *) 0 */);

int execv (const char * pathname, char * const argv[]);


// 리턴값 : 리턴하지 않음. 에러 시 -1을 리턴

 





그래서 정리를 하게 됨


먼저 const 란?

상수화 시킨다는 뜻의 키워드로, 처음 정해진 값을 변경할 수 없다.



1. const char * ptr

2. char const * ptr


둘 다 ptr 앞에 *가 붙어있다고 보면 된다.

const char (* ptr)

char const (* ptr)


따라서 ptr이 가리키는 곳(데이터)을 바꾸려고 하면 에러가 발생.


3. char * const ptr

ptr 앞에 *이 아닌 const가 붙어있다.

char * (const ptr)


따라서 'ptr 자체가 상수' 라고 생각하면 된다.

ptr의 값, 즉 ptr은 포인터 변수이므로 ptr 변수에 저장된 어딘가를 가리키는 주소값을 변경하려고 하면 에러 발생.



[예제]

다음 코드를 컴파일 시 에러가 나는 라인은?


const char * ptr1;

char * const ptr2;

int num = 0;


ptr1 = &num;

ptr2 = &num;


*ptr1 = 10;

*ptr2 = 20;


'C와 C++' 카테고리의 다른 글

[C++][작성중] STL 큐, 스택 비교  (0) 2018.02.07
[C/C++] C언어 배열초기화  (0) 2016.07.19

C++ STL 

자료구조 Queue, Stack 비교


 

 Queue

Stack 

 방식

선입선출(FIFO) 

후입선출(LIFO 

헤더 & 선언

  #include<queue>

  using namespace std;

  queue <int> Q;

  #include <stack>

  using namespace std;

  stack<int> S;

처음

  (front/앞/나가는곳) 

  Q.front();

  첫번 째 원소 값 리턴.

  (top/위) 

  S.top();

  맨 위의 원소 값 리턴

  (rear/back/뒤/들어오는곳) 

  Q.end()

  마지막 원소가 아님.

  마지막 원소의 다음을 가리킴.         

  (bottom/아래) 

 삽입

  Q.push( 값 ) 

  S.push( 값 ) 

 삭제

  Q.pop()

  첫번 째 원소 삭제. 리턴하지 않음.

  S.pop()

  맨 위의 원소 삭제

 크기

  Q.size() 

  S.size() 

 비었는지

  Q.empty()

  S.empty() 

 

 

 

 

 

 


'C와 C++' 카테고리의 다른 글

const char * / char * const / char const * 차이  (0) 2018.05.16
[C/C++] C언어 배열초기화  (0) 2016.07.19

우선 선언은 

자료형 이름 [중괄호] ; 순서로!


C언어 배열 초기화하는 방법


1. 하나하나 초기화


int ary[3];

ary[0] = 0;

ary[1] = 0;

ary[2] = 0;


또는


for(i=0; i<3; i++)

ary[i] = 0;



2. 배열 선언시 초기화


int ary[3] = {0};


int ary[3] = {1, 2, 3};


int ary[] = {1, 2, 3};



? 이렇게 하면?

int ary[3] = {1};

ary[0]만 1, 나머지는 0으로 초기화 된다.




3. memset() 함수 이용


#include <cstring.h>

//soen에는 <mem.h>라고 나오네


int ary[3];

memset( ary, 0, sizeof(int) * 3 );


//memset( void * s, int c, size_t n );

//memset(초기화할 배열, 초기화할 값, 배열 크기);




* C++에선 memset 말구

std::fill(시작, 끝, 값)

☆ 시작은 포함, 끝은 포함하지 X : [시작,끝)

또는

std::fill_n(배열, 사이즈, 값);



  using namespace std;

  fill(arr[begin], arr[end], -1);

  fill_n(arr, 40, -1);





* Java 배열 선언, 초기화

int arr1 [] = {1, 2, 3};

int [] arr2 = {1, 2, 3};


int [3] arr3;    // X

int [] arr4;

arr4 = new int[3];

arr4 = new int[]{1, 2, 3};

'C와 C++' 카테고리의 다른 글

const char * / char * const / char const * 차이  (0) 2018.05.16
[C++][작성중] STL 큐, 스택 비교  (0) 2018.02.07

+ Recent posts