728x90
300x250
[C++] 입출력 - 표준 출력

언어를 공부하면서 가장 먼저 접하는 것은 바로 표준 입출력을 통한 데이터의 I.O(Input Output)을 수행하는 과정일 것입니다.
그만큼 표준 입출력은 언어를 이용함에 있어서 가장 중요한 부분이자, 얼마만큼이나 사용하기 편리하고 높은 퍼포먼스를 보여주냐가 언어의 관건이
될수 있겠습니다.


C++언어에서는 버퍼를 통한 표준 입출력을 cout, cin을 이용해서 수행할 수가 있습니다.

cout, cin의 맨 앞자는 character를 뜻하는 것으로 문자의 I.O의 전반을 다룬다는 의미로 볼수가 있습니다.
이들 표준 입출력을 위한 전역 개체는 각각 istream과 ostream 헤더에서 정의된 것으로 C 스타일 함수군보다 I.O가 직관적이고, 안전하게 수행할 수 있도록 도와준다고 할수 있습니다.

따라서 인자를 전달하거나 할 때 cout, cin을 복사하지 않도록 주의하시기 바랍니다.

1. 표준 출력
cout은 <iostream>에 선언되어 있는 표준 출력을 담당하는 전역 개체입니다.
이 개체는 char타입으로 데이터를 출력하는 ostream 클래스의 인스턴스로 표준 출력 장치에 연결되어 출력 업무를 수행합니다.(Buffered I/O)

[예제]

#include <iostream>

using namespace std;

int main()
{

    cout << "This is Wresting\n";
    const char *k = "Wresting";
    cout << "This is " << k << '\n';

}


출력 : This is Wresting
         This is Wresting
반응형
728x90
300x250

[C언어] 문자열과 포인터 배열

태스트 환경 : Visual Studio 2008

이 예제는 일반적인 문자 배열에 대한 메모리 낭비를 직접적으로 보여주는 예제이다.
더불어 strcpy 함수에 대한 비밀까지 자세히 수록하고 있는 예제이다...

#include <stdio.h>

main()
{
 int i;

 char name[5][20];

 strcpy(name[0], "Jung Jae Une");
 strcpy(name[1], "Han Woo Ryong");
 strcpy(name[2], "Byun Ji Ha");
 strcpy(name[3], "Lee Do Geun");
 strcpy(name[4], "Hong Jae Mok");

 for(i=0; i<5; i++)
  puts(name[i]);

}

결과 :
Jung Jae Une
Han Woo Ryong
Byun Ji Ha
Lee Do Geun
Hong Jae Mok

반응형
728x90
300x250

[C언어] 문자열에 대해서

태스트 : Visual Studio 2008

소스

#include <stdio.h>

main()
{

 char *imsip;
 char imsi;

 imsip = 'a';     /* 1번 */
 imsip = "a";     /* 2번 */

 imsi = 'a';       /* 3번 */
 imsi = "a";       /* 4번 */

}

설명 :

1번
: 'a' 문자를 할당하려고 하는 것이다. imsip = 'a';의 의미는 'a'에 해당하는 아스키코드 정수 값을 imsip에 넣으려고 하는 것과 같습니다. imsip에는 주소 외에는 다른 값이 할당 될 수 없으므로 문법적으로 옳지 않습니다.
2번 : "a"라는 문자열이 메모리의 어딘가에 저장되고 이 저장된 주소를 imsip에 대해 할당하므로 맞는 문장입니다. "a"는 뒤에 널 문자가 추가된 문자열이며 문자가 아닙니다.
3번 : 'a'문자를 imsi에 할당합니다. 아스키 정수 값이 imsi에 할당되므로 문법적으로 하자가 없습니다.
4번 : "a"는 문자열이며 문자열은 주소 값을 리턴하므로 "a"가 저장된 곳의 주소가 imsi에 할당됩니다. 물론 메모리 접근 오류이므로 에러가 나타나게 되겠습니다.

반응형
728x90
300x250

[C언어] 포인터 배열 정리

[소스]

#include <stdio.h>

#define print(imsi) printf(#imsi "\t%08x %d\n", imsi, sizeof(imsi))

main()
{

 int imsi_1[2] = { 5, 7 };
 int imsi_2[3] = { 45, 67, 25 };
 int imsi_3[4] = { 27, 34, 87, 25 };

 int *temp[3];

 temp[0] = imsi_1;
 temp[1] = imsi_2;
 temp[2] = imsi_3;


 print(temp);
 print(&temp);
 print(*temp);
 print(temp[0]);
 print(&temp[0]);

}


결과 :

temp    0012ff1c 12
&temp   0012ff1c 4
*temp   0012ff5c 4
temp[0] 0012ff5c 4
&temp[0]        0012ff1c 4


[설명]

1. temp
Temp는 포인터 변수들의 모임인 포인터 배열의 모 배열입니다. 대상체는 temp 배열 전체이므로 12가 출력됩니다.
2. &temp
temp가 저장된 곳의 주소를 출력하라는 뜻으로 사용했지만 temp는 배열명으로써 메모리 할당을 받지 않기 때문에 temp와 같은 값을 출력하게 되지요. 의미상으로는 맞지 않지만 ANSI에서 새로 추가하여 에러는 발생하지 않습니다... 또한 주소 값에 대한 sizeof()이므로 당연히 4가 출력됩니다.
3. *temp
temp가 가리키는 것은 temp[0]입니다. temp는 temp[0], temp[1], temp[2] 전체를 대상으로 하기 때문에 12가 출력되었지만 *temp가 가리키는 대상체는 temp[0]이며 이것이 할당된 메모리 영역은 4바이트이므로 4가 출력됩니다.

Tip) temp 자체에 대한 대상체를 * 연산자를 이용하여 출력하려면 다음과 같이 하면 되겠습니다.

물론 2차원 배열에 대한 주소 값을 받은 상태라면 이것은 행 전체에 대한 크기를 출력해 줄 것입니다.

printf("%d\n", sizeof(*&temp));

4. temp[0]
temp[0]은 포인터 변수이다. temp[0]을 위해서 할당된 메모리 영역은 4바이트이므로 4가 출력됩니다.

5. &temp[0]
temp[0]에 &연산자를 사용하여 메모리를 출력하고 있습니다. 이 메모리에 대한 메모리 할당은 당연히 4바이트이므로 4가 출력되겠습니다.
반응형
728x90
300x250

[C언어] 꼭 알아야 할 배열 포인터

태스트 : Visual Studio 2008.

#include <stdio.h>

main()
{

 int i, j;

 int imsi[3][2] = {{6, 3}, {9, 1}, {7, 2}};

 int (*imsip)[2];

 imsip = imsi;

 for(i = 0; i < 3; i++)
  for(j = 0; j < 2; j++)
   printf("[ %d][ %d] %d\n", i, j, *(*(imsip + i) + j));

 printf("################################################\n");

 for(i = 0; i < 3; i++)
  for(j = 0; j < 2; j++)
   printf("[ %d][ %d] %d\n", i, j, *(imsip[i] + j));

 printf("################################################\n");

 for(i = 0; i < 3; i++)
  for(j = 0; j < 2; j++)
   printf("[ %d][ %d] %d\n", i, j, imsi[i][j]);

 printf("################################################\n");

 for(i = 0; i < 3; i++)
  for(j = 0; j < 2; j++)
   printf("[ %d][ %d] %d\n", i, j, imsip[i][j]);

}


출력

[ 0][ 0] 6
[ 0][ 1] 3
[ 1][ 0] 9
[ 1][ 1] 1
[ 2][ 0] 7
[ 2][ 1] 2
################################################
[ 0][ 0] 6
[ 0][ 1] 3
[ 1][ 0] 9
[ 1][ 1] 1
[ 2][ 0] 7
[ 2][ 1] 2
################################################
[ 0][ 0] 6
[ 0][ 1] 3
[ 1][ 0] 9
[ 1][ 1] 1
[ 2][ 0] 7
[ 2][ 1] 2
################################################
[ 0][ 0] 6
[ 0][ 1] 3
[ 1][ 0] 9
[ 1][ 1] 1
[ 2][ 0] 7
[ 2][ 1] 2


2. 2차원 배열 포인터 변수에 주소 할당

#include <stdio.h>

main()
{

 int imsi[3];

 int *imsip;


 imsip = imsi;


 printf("%d\n", sizeof(imsi));
 printf("%d\n", sizeof(imsip));
 printf("%d\n", sizeof(*imsip));

}


결과

12
4
4

설명 :
imsi[0] + imsi[1] + imsi[2] 이므로 4 + 4 + 4 = 12Byte
imsip, *imsip 는 포인터 변수이므로 무조건 4Byte로 할당됩니다.
반응형
728x90
300x250
[C언어] 포인터 변수 관계

태스트 환경 : Visual Studio 2008.

#include <stdio.h>

main()
{

/* 변수 선언 */

 int imsi;
 int *imsip;

/* 1. 주소 */

 printf("[1. Address]\n");
 printf("IMSI : %#010x\n", imsi);
 printf("*IMSIP : %#010x\n", imsip);

 imsip = &imsi;

/* 2. 주소 */

 printf("[2. Address]\n");
 printf("IMSI : %#010x\n", imsi);
 printf("*IMSIP : %#010x\n", imsip);

 *imsip = 1024;

/* 3. 주소 */

 printf("[3. Address]\n");
 printf("IMSI : %#010x\n", imsi);
 printf("*IMSIP : %#010x\n", imsip);
 printf("Result : %d\n", *imsip);

}

출력 결과 :

[1. Address]
IMSI : 0xcccccccc
*IMSIP : 0xcccccccc
[2. Address]
IMSI : 0xcccccccc
*IMSIP : 0x0012ff60
[3. Address]
IMSI : 0x00000400
*IMSIP : 0x0012ff60
Result : 1024

반응형
728x90
300x250
[C언어] 포인터 변수에 번지 할당


태스트 : Visual Studio 2008

#include <Stdio.h>

main()
{

 int imsi;
 int *imsip;

 printf("[1. Address]\n");
 printf("IMSI : %#010x\n", &imsi);
 printf("*IMSIP : %#010x\n", imsip);

 imsip = &imsi;

 printf("[2. Address]\n");
 printf("IMSI : %#010x\n", &imsi);
 printf("*IMSIP : %#010x\n", imsip);

}

결과 :

[1. Address]
IMSI : 0x0012ff60
*IMSIP : 0xcccccccc
[2. Address]
IMSI : 0x0012ff60
*IMSIP : 0x0012ff60

반응형
728x90
300x250

[C언어] 포인터를 이용한 다중 배열 요소의 출력 - 2 -

이번에는 포인터를 이용한 다중 배열 요소의 출력을 해보도록 하겠습니다.
*(a+0) 형식을 응용한 형태의 꼴로 구현 할 수 있습니다.

a[2][2][2] 의 경우 배열로 어떻게 표현하나요?

int a[2][2][2] = {{{3,3},{3,3},{3,3}},{{a,b},{b,c},{c,a}},}

이런 형태로 구현이 가능하겠죠.

a[1][2] = {{2,2},{3,3}}

이런 다차항의 배열 또한 역시나 수식으로 표현하실 수가 있습니다.

a[i][j]

*(*(a + i) + j)

단, a는 포인터로 연결된 배열 변수

이처럼 다중 포인터 역시나 쉽게 구현이 가능하겠습니다.
아래의 소스코드를 가지고 연습해보시기 바랍니다.

#include <stdio.h>

int main()
{
 
 int a[2][3][2] = {{{10,20},{20,30},{30,40}},{{60,70},{70,80},{90,30}}};
 
 int b[2][3] = {{10,20,30},{20,30,40},};

 int c[5] = {10,20};

 int * nk;

 nk = c;

 /* 주의 : 포인터 변수로 선언 후에 배열 포인터로 지정하여 계산한다.*/

 printf("%d", *(*(*(a+1) + 2) + 0));

}

반응형

+ Recent posts