728x90
300x250

[C#.NET] 구조체 설명

using System;
class Program
{

struct student{
public string name;
public byte age;

// 메서드 선언
public student(string n, byte b)
{
name = n;
age = b;
}
}

static void Main()
{
student Person;

Person.name = "정원영";
Person.age = 20;

// 메서드 이용
// student Person = new student(string n, byte b)

Console.Writeline("Person의 이름 : {0}, 나이 : {1}", Person.name, Person.age);
}
}


구조체는 C언어와 C++의 핵심이자 객체지향의 핵심입니다.
클래스라는 개념도 바로 구조체라는 것을 통해 만들어졌습니다.
위의 예제는 구조체를 쉽게 이해하고자 하는 분께 많은 도움이 될 것입니다.

반응형
728x90
300x250

[C.NET] Microsoft C# 공식 강좌 사이트 안내
http://msdn.microsoft.com/ko-kr/library/67ef8sbd(VS.80).aspx

이곳에 들어가시면 C#.net과 VB.net에 대한 상세한 프로그래밍 가이드를 보실 수 있습니다.
웬만한 프로그래밍 서적에 비해 깔끔하고 핵심만 추려 설명하고 있으니 참조 바랍니다.

반응형
728x90
300x250

[C언어] 포인터의 상수화 const

이 글은 소개하는 글은 아니고, 편안하게 생각을 정리해보기 위해서 작성하였습니다.


가정 1 : const int ……(포인터 생략)

문제 1 : const int는 무슨 변화를 일으키는 것 일까?
-> 결과 : 주소 변경만 허용

의문점이 생길 수 있는 가정 조건)
* const int * 꼴인데, int const * 꼴로 하면 어떻게 처리 될 것인가?

가정 2 : int * const ……(포인터 생략)
-> 결과 : 상수로서 처리만 가능.

반응형
728x90
300x250

[C언어] C언어 널포인터를 활용한 출력 결과

ptr이 예를 들어 x0000 주소라고 한다면, ptr의 값을 1증가 시킬 때 그 다음 번지는 무엇일까?


 #include <stdio.h>

 int main()
 {

int *ptr1 = 0;
char *ptr2 = 0;
double *ptr3 = 0;

printf("%d, %d, %d \n", ptr1++, ptr2++, ptr3++);
printf("%d, %d, %d \n", ptr1, ptr2, ptr3);

return 0;

 }
 

출력 : 0, 0, 0
         4, 1, 8


'포인터 연산에 따른 실질적인 값의 변화는 포인터 타입에 따라 다르다'는 결과를 알 수 있다.
int형 변수는 4바이트이다.
int *타입의 포인터 변수 값을 하나 증가시키면 4가 증가한다.
char형 변수는 1바이트이다.
char *타입의 포인터 변수 값을 하나 증가시키면 1이 증가한다.

즉,
x0001의 주소의 다음을 가르키는 주소는 x0004 이다.

반응형
728x90
300x250

[C언어] main()함수의 인자 활용(명령행 인자 : argc, argv)

C언어 책을 보면 Argv, Argc라는 것이 구구절절 설명되어 있다. 이 부분이 설명되어 있는 영역의 주제는 대분류로 보자면 '함수'영역에 있으며 세부분류에 보면 'main()함수의 인자 활용'이라는 곳에 나오는 부분이다.
나는 먼저 인자라는 말을 '조건'이나 '발생하는 원인 요소'로 바꾸고 설명하겠다.

우리가 CUI를 올리든 GUI를 올리든 기본적으로 발생하는 함수의 조건은 main()이다.
main() 또한 역시나 요소(factor)가 존재한다. 그렇지만 main()함수는 구성하는 각각의 요소가 명확히 정해져 있지 않다.

선수 지식 : 포인터나 배열


1. main()함수를 구성하고 있는 요소가 명확하지 않는 이유는 무엇일까?

그 이유는 main()함수가 운영체제에 의해 실행되는 진입점 역할을 하므로 프로그램의 시작과 종료시 다양한 시스템에서의 운영 환경을 수용할 수 있도록 유연해야만 하기 때문이다.

오늘 실습은 main()함수의 인자 활용이라는 주제이기 때문에 argc, argv라는 함수를 활용하는 실습을 해보겠다.
main()함수에서 argc, argv에 대한 다음과 같은 형태의 원형을 지원한다.
int main(int argc, char *argv[]);

콘솔에서는 다음과 같이 사용된다.




2. Argc, Argv를 담고 있는 헤더는 무엇인가?

#include <stdlib.h>

용어 정리)
1. Argc는 무엇인가?
Argument Count
명령행 개수

2. Argv는 무엇인가?
Argument Vector
명령행 메모리 목록(배열)


3. Argc 단독 사용

#include <stdio.h>
#include <stdlib.h>

int main(int argc)
{

 printf("%d", argc);

}



태스트 결과


1번 : 'ch02_01' 입력했을 때?
출력값 : 1
2번 : 'ch02_01 ' 입력했을 때?
출력값 : 1
설명 : [0][0]은 기본값 ch02_01이므로 1
더불어 파일명이기 때문에 자신 스스로임
3번 : 'ch02_01 1' 입력했을 때?
출력값 : 2
설명 : [1][0]
4번 : 'ch02_01 12' 입력했을 때?
출력값 : 2
설명 : [1][0],[1][1]
5번 : 'ch02_01 12 ' 입력했을 떄?
출력값 : 2
설명 : [1][0], [1][1], [1][2]
빈칸은 \n으로 메모리 주소에 기억이 됩니다.
6번 : 'ch02_01 12 3' 입력했을 때?
출력값 : 3
설명 : [2][0]



4. Argc, Argv

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{

 printf("[0][0]\n");
 printf("테스트 1번:%d %c\n", argc, argv[0][0]);

}



태스트 결과


설명 : [0][0]이므로 1개, c는 자기 자신(파일명)을 메모리에 주소로서 처리하고 있음.
예) [0][0] = c, [0][1] = h, [0][2] = 0

보충 설명 : char *argv[]를 char **argv로 쓸 수 있음.
포인터의 포인터(**)는 * 포인터의 주소를 저장하기 위해 사용.
배열로서 해석될 수 있는 영역임.


5. 참고) Argc, Argv, Env 활용


Env는 Environment의 약자로서 환경을 의미합니다.
환경설정 내용을 보기위해 사용하는 인자입니다.
main()함수에서 다음과 같은 형식의 원형으로 사용됩니다.

int main(int argc, char **argv, char **env)

소스

#include <stdio.h>

int main(int argc, char **argv, char **env)
{
 for(;env;env++)
  puts(*env);
}



태스트 결과

반응형
728x90
300x250
[C언어] 제어문(if, switch)

리모컨과 같은 원리로서 사용이 되는 문법입니다.


출력 : a, b의 값에 따른 해당 연산 값 출력

반응형
728x90
300x250

[C언어] strcpy()의 함정

#include <stdio.h>
#include <string.h>

main()
{

 char *ccc;

 strcpy(ccc, "hahaha");

}

포인터와 배열의 관계를 이해하시고 위에 strcpy 함수에 대해 접하시게 된다면 Segment오류로 인해 잠시 고뇌하실것입니다.
혹은 아래와 같이 해결할 수도 있을 겁니다.

#include <stdio.h>
#include <string.h>

main()
{

 char ccc[10];

 strcpy(ccc, "hahaha");

}

strcpy()의 원형을 잠시 소개하자면

char *strcpy(char *s1, const char *s2);
strcpy() 함수는 s1인자로 포인터를 받고 s2도 포인터로 받고 있습니다.
즉 첫번째 인자를 두번째 인자로 넘겨줍니다.

*포인터 변수를 다시 생각해보자면, 포인터 변수로 설정이 된 순간부터 이미 우리도 모르는 사이에 주소영역을 사용하고 있을것입니다. 그렇기에 임시로 받아줄 영역을 찾게 되는 것이 아닐까 생각합니다.

imsi 라는 변수는 프로그램이 실행될 때마다 빈 영역의 주소를 찾아 랜덤으로 검색하게 됩니다.
imsi라는 변수 주소중에 비어있는 영역을 찾기위해 아래와 같이 입력할 수 있습니다.

int imsi;
printf("%#010x", &imsi);

찾은 임시 주소가 0x002bfb10와 같다면 아래와 같이 입력할 수가 있습니다.
<string.h> 해더를 불러오지 않을 경우에 심각한 오류가 발생할 수도 있습니다.
(그렇게 심각하지는 않지만 실행이 안되는 경우가 발생하기에 경고 정도로 받아들이시면 되겠습니다.)

#include <stdio.h>
#include <string.h>

main()
{
     int imsi;
     char *ccc;

     imsi = 0x002bfb10;

     ccc = (char *)imsi;

     strcpy(ccc, "hahaha");
     printf(ccc);

}

반응형
728x90
300x250

[C언어] 교환 Swap 알고리즘

#include <stdio.h>

int main()
{

        int a, b, c = 0;
        int *pa, *pb, *pc;
        int swap;
 
        pa = &a;
        pb = &b;
        pc = &c;

        scanf("%d %d %d", pa, pb, pc);

       if(a > b);
      
       else if(a < b)
       {
              swap = b;
              b = a;
              a = swap;
       }
     
       if(a > c);
      
       else if(a < c)
       {
             swap = a;
             a = c;
             c = swap;
       }

       if(b > c);
      
       else if(b < c)
       {
            swap = b;
            b = c;
            c = swap;
       }

       printf("%d %d %d", a, b, c);

}

[출력]
a , b,  c 대로 정렬됨.

반응형

'소프트웨어(SW) > GNU - C, C++' 카테고리의 다른 글

[C언어] 제어문(if, switch)  (0) 2009.07.23
[C언어] strcpy()의 함정  (0) 2009.07.07
[C++] 입출력 - 표준 출력  (0) 2009.07.04
[C언어] 문자열과 포인터 배열  (0) 2009.06.07
[C언어] 문자열에 대해서  (0) 2009.06.07

+ Recent posts