$bash

'0x0300 : Study/0x0304 : Programming'에 해당되는 글 18건

  1. 빅오? 복잡도 분석?
  2. Cpp STL 정리(미완성)
  3. Cpp 기초 (A+B 응용화)
  4. NASM - LD 컴파일 후 실행
  5. C - 배열과 포인터
  6. C - 포인터
  7. C - 배열
  8. C - 함수

빅오? 복잡도 분석?

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

Cpp STL 정리(미완성)

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

Cpp 기초 (A+B 응용화)

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

NASM - LD 컴파일 후 실행

0x0300 : Study/0x0304 : Programming


'0x0300 : Study > 0x0304 : Programming' 카테고리의 다른 글

Cpp STL 정리(미완성)  (0) 2017.05.24
Cpp 기초 (A+B 응용화)  (0) 2017.05.24
C - 배열과 포인터  (0) 2016.06.14
C - 포인터  (0) 2016.06.13
C - 배열  (0) 2016.06.13

C - 배열과 포인터

0x0300 : Study/0x0304 : Programming


배열과 포인터

배열명 - int ary[3];

   - ary == &ary[0];

배열명 + 정수 - int ary[3];

 ary + 1;

배열명과 포인터는 같다. - int ary[3];

 int *pa = ary;

 pa[1] =10;

배열명과 포인터는 다르다. - ary ++; (틀림)

     pa ++ ; (맞음)



배열명의 정체

배열명은 컴파일 과정에서 첫 번째 배열 요소 주소로 변환

// 배열- 자료형이 같은 변수 메모리에 연속 할당


배열명이 주소인지 확인 해주는 코딩이다.

배열명은 따로 지정이 안했기 때문에 첫번째 값과 두번째 주소값이 같게 나오는 것을 확인 할 수 있다.

배열명이 요소와 첫번째 요소의 값 또한 요소가 가리키는 것이 첫번째 배열 이기 때문에 쉽게 찾을 수 있다.


배열명으로 배열 요소 사용

// 주소는 정수처럼 보이지만 자료형에 대한 정보를 갖고 있는 특별한 값이다.

// 정해진 연산만 가능


배열명에 정수 연산을 수행하여 배열 요소를 사용하는 방법 이다.


// ary[1] = *(ary + 1)

// ary[2] = ary + 2


배열명 역활을 하는 포인터

포인터가 배열명 저장하면 배열명처럼 사용 가능.


배열명처럼 사용되는 포인터이다. 


// pa[2] = pa[0] + pa[1]

// *(ary + 2) =  *(ary + 0) + *(ary + 1)

// 둘다 같음을 알 수 있다.


배열명과 포인터의 차이

sizeof 함수 사용 결과의 차이

//배열명에 사용시 배열 전체의 크기를 나타냄

// 포인터에 사용하면 포인터 하나의 크기를 나타냄


변수와 상수의 차이

// 포인터는 그 값을 바꿀 수 있음

// 배열명은 상수이므로 값을 바꿀 수 없음


포인터를 이용한 배열의 입출력 과정이다.


포인터의 뺄샘과 관계 연산

포인터의 뺄셈

// 포인터 - 포인터 > 값의 차 >> 가리키는 자료형의 크기


관계 연산자로 포인터의 대소관계 확인 가능


포인터의 뺄셈과 관계 연산을 코딩을 한 예제이다.


배열의 입출력을 처리하는 함수

주소를 데이터로 주면 해결


호출 - int ary[5] = {10, 20, 30, 40, 50};

 print_ary(ary, 5);


정의 - void print_ary(int *pa, int size)

 {

  printf("%d", pa[i]);

 }


배열의 값을 출력하는 함수

배열의 값 확인하기 위해 수시로 출력해야 한다면?

// 그 기능을 함수로 만들어 호출

// 함수 호출할 때는 배열명을 주고, 함수의 매개변수로 포인터 선언

// 함수 안에서 포인터를 배열명처럼 사용


배열의 값을 함수를 정의해 출력해주는 내용이다.


// print_ary 함수에서는 배열명인 ary를 사용할 수 없다. 따라서 pa값으로 반복문을 처리한 것이다.


배열 요소의 개수가 다른 배열도 출력하는 함수

배열 요소 수가 달라도 원하는 배열 출력 가능한 예제

// 함수 호출 할 때 배열명과 함께 배열 요소 수도 인자로 넘김


크기가 다른 배열을 출력하는 함수이다. 


// 매개변수 size는 배열의 요소 수를 받아 저장하고 그만큼 반복을 한다.

// 출력할 배열 요소수가 바뀌어도 그에 맞춰 모든 배열 요소의 값이 출력이 가능하다는 것이다.


배열에 값을 입력하는 함수

입력 함수는 데이터를 저장할 배열의 위치가 필요하다.

// 배열에 값 입력하는 함수는 함수 안에서 포인터 직접 사용.


배열에 값을 입력하는 함수이다.

'0x0300 : Study > 0x0304 : Programming' 카테고리의 다른 글

Cpp 기초 (A+B 응용화)  (0) 2017.05.24
NASM - LD 컴파일 후 실행  (0) 2017.05.13
C - 포인터  (0) 2016.06.13
C - 배열  (0) 2016.06.13
C - 함수  (0) 2016.06.13

C - 포인터

0x0300 : Study/0x0304 : Programming

포인터

변수의 메모리 주소 저장하는 변수

// 변수?

/ 메모리 상의 저장공간

/ 그 위치를 알면 사용할 수 있음


//위치값 - 주소


포인터와 연산자

주소 연산자 - int a;

     &a;

포인터 - char *pc;

              int *pi;

      double *pd;

간접 참조 연산자 - *pi = 10;


주소연산자

프로그램이 사용하는 메모리에는 바이트 별로 주소값 존재

// 0부터 시작하고 바이트 단위로 1씩 증가

// 2바이트 이상의 크기를 갖는 변수는 여러 개의 주소값에 걸쳐 할당


이러한 코딩으로 변수의 메모리 주소를 확인 할 수 있다.


포인터와 간접참조 연산자

예시로 포인터에 대해 설명해보자.


포인터는 '*' 를 앞에 붙이며 저것은 포인터를 의미하는 표기이다.


int *pa;

int는 주소를 구한 변수의 형태를 의미하며 *는 포인터의 기호, pa 는 포인터의 이름이다.


간접참조 연산자를 사용한 예시로.

대입 연산자 왼쪽 

변수 a사용 // a = 10; 

포인터 pa 사용 // *pa = 10;

대입 연산자 오른쪽

변수 a사용 // b = a;

포인터 pa 사용 // b = *pa;

피연산자

변수 a사용 // a + 20;

포인터 pa 사용 // *pa + 20;

출력

변수 a사용 // printf("&d", a);

포인터 pa 사용 // printf("%d", *pa);

입력

변수 a사용 // scanf("%d", a);

포인터 pa 사용 // scanf("%d", &*pa);

 // scanf("%d", pa);


여러 가지 포인터

// 다양한 포인터의 사용법


포인터를 사용한 두 정수의 합과 평균 계산을 하는 코딩이다.

위처럼 가리키는 변수의 형이 같은 경우 포인터 연속 선언이 가능하다.

포인터의 선언과 동시에 초기화 하는 것 또한 가능한 것을 확인 할 수 있다.


const를 사용한 포인터

// 포인터에 const함수를 사용해보자.


포인터에 const 함수를 사용하여 만든 코딩의 예시이다.


const가 일반 변수 처럼 포인터 값을 고정시킨다면 9행에서 pa는 다른 변수의 주소를 저장 할 수 없다.

pa는 const의 사용과는 무관하게 변수 b 주소 저장, 그 값 간접 참조하여 출력한다.

// 에러 발생 :: l-value 가 const 개체를 지정합니다.


포인터와 주소의 차이

주소는 변수에 할당된 메모리 저장 공간 시작 주소값 자체이다.


포인터는 그 값 저장하는 또 다른 메모리 공간

// 특정 변수의 주소값은 바뀌지 않음

// 포인터는 다른 주소 대입하여 그 값을 바꿀 수 있음


예시로

int a, b;    // 일반 변수 선언

int *p;      // 포인터 선언

p = &a;    // p가 a를 가리키도록 설정

p = &b;    // p가 변수 b를 가리키도록 바꿈


이러한 예시 뿐만 아니라 두 포인터를 한 주소로 저장 할 수 있다.

int a;

int *pa, *pb;

pa = pb = &a;


// 자세한 설명은 생략한다.


주소와 포인터의 크기

모든 주소와 포인터는 같은 크기

// 저장할 주소의 크기에 따라 결정

// 크기가 클수록 더 넓은 범위의 메모리 사용 가능

// 포인터의 크기는 컴파일러에 따라 다를 수 있음


sizeof 연산자를 가지고 주소와 포인터의 크기를 출력하는 코딩이다.

3가지의 변수의 주소 크기는 4로 일정하며, 포인터의 크기 또한 4 로 일정하다.

하지만 각각의 포인터가 가리키는 변수의 크기는 char가 1,  int가 4, double이 8로 나타난다.


포인터의 대입 규칙

크기가 모두 같으므로 대입 연산 쉽게 생각 할 수 있다.

// 포인터는 가리키는 변수의 형태가 같을 때만 대입

// 포인터끼리 대입 연산 수행

/ 여러 개의 포인터로 같은 데이터 다루는 것이 가능

위의 코딩은 허용되지 않은 포인터의 대입이다.


포인터가 필요한 EU

변수 사용하는 가장 쉬운 방법은 이름을 쓰는 것

// 포인터를 사용하려면 추가적인 변수 선언 필요

// 각종 연산 수행해야 하므로 필요한 곳에만 사용


포인터를 사용한 두 변수의 값 교환이다.

swap이라는 이름으로 매개변수로 포인터를 선언하여 두 변수의 값을 바꿨다.


포인터 없이 두 변수의 값 바꾸기

swap 함수에서 main함수의 a,b를 이름으로 직접 사용하는 방법


이 과정에서 a, b를 이름으로 직접 사용하는 방법을 사용했기 때문에 선언되지 않는 식별자로 에러가 뜬다.


// 그래도 기본적인 배열에서 교환하는 것 이랑 비슷비슷해서 .. 자세한건 생략!


'0x0300 : Study > 0x0304 : Programming' 카테고리의 다른 글

Cpp 기초 (A+B 응용화)  (0) 2017.05.24
NASM - LD 컴파일 후 실행  (0) 2017.05.13
C - 배열과 포인터  (0) 2016.06.14
C - 배열  (0) 2016.06.13
C - 함수  (0) 2016.06.13

C - 배열

0x0300 : Study/0x0304 : Programming

배열?

각 저장 곤간을 이름과 index로 구분.

메모리에 저장 공간 한꺼번에 확보.

사용할 때는 하나씩 떼어 쓰는 방식으로 구현


선언과 초기화 그리고 요소의 사용


선언 - int ary[5];

초기화 - int ary[5] = {1, 2, 3, 4, 5};

요소 사용  - ary[0], ary[1], ary[2], ary[3], ary[4]..


배열의 기본적인 예시이다.


int a, b, c, d, e; 를 예시로 들어보자.

여기서는 a , b , c .. 각각의 변수에 4바이트씩 공간이 주어져 있다.


int ary[5]; 는

메모리에 공간이 연속적으로 20바이트가 할당되어 있다.


배열의 초기화

최초 할당된 저장 공간에는 쓰레기값 존재.

// 배열이 선언과 동시에 원하는 값 갖도록 하려면 초기화.


배열은 중괄호로 묶어서 초기화

// 반드시 선언과 동시에 초기화

// 선언하고 난 후에 값 저장하려면 배열 요소에 하나 씩 값 대입



배열과 반복문

배열은 같은 형태의 변수가 많이 필요할 때 쉽게 저장 공간 할당, 초기화 가능한 장점 가짐


모든 배열 요소를 일일이 하나씩 사용하는 것은 번거로움


성적 처리 프로그램을 예시로 반복문과 배열을 조합한 코딩을 할 수 있다.


위에서 보면 알 수 있는데

for (int i = 0; i < 5; i++)

{

printf("%5d\n", score[i]);

}

에서 for에서의 i는 score의 i 를 배열의 첨자로 활용 가능하다.


Sizeof 연산자를 활용한 배열 처리

배열은 보통 많은 양의 데이터 처리

// 반복문 사용 필수


배열 요소 수가 바뀌는 경우?

// 배열 처리 반복문을 모두 수정해야 하는 부담

// 배열 요소 수를 직접 계산 하여 반복문에 사용하면 편리


배열 요소 수 = sizeof (배열명) / sizeof (배열 요소)


sizeof 연산자를 사용한 배열의 예시이다.


cnt = sizeof(score) / sizeof(score[0]);

cnt는 배열 요소 수 (5) 가 되고 score은 배열 전체 크기인 20바이트 이며 배열 요소 하나의 크기는 score[0]이 4바이트로 주어진다.


char 형 배열선언과 초기화

문자열은 문자의 연속

// 문자열 저장할 때는 char형 배열 사용


가장 기본적인 예시이다.


문자열 끝에 널 문자가 없는 경우가 있다

이러한 경우는 쓰레기 값을 문자열로 출력 하기도 한다...


이처럼 뒤에 빈공간이 있다면 글자가 이상한 쓰레기 값이 출력 되는 것을 확인 할 수 있다.

// 물론 테스트는 하지 않았습니다 ^ㅡ^...


문자열 대입

char형 배열은 문자열 저장하는 변수의 역할을 한다.

// 초기화 된 이후에도 새로운 문자열 저장이 가능

// 문자열의 길이가 다를 수 있음


strcpy함수를 활용한 문자열 대입하는 배열 예제이다.


문자열 입출력 함수로 gets, puts가 있다.



'0x0300 : Study > 0x0304 : Programming' 카테고리의 다른 글

Cpp 기초 (A+B 응용화)  (0) 2017.05.24
NASM - LD 컴파일 후 실행  (0) 2017.05.13
C - 배열과 포인터  (0) 2016.06.14
C - 포인터  (0) 2016.06.13
C - 함수  (0) 2016.06.13

C - 함수

0x0300 : Study/0x0304 : Programming

함수? 

선언 - 정의 - 호출 로 세 가지의 상태로 사용할 수 있다.


//

선언 int add ( int a, int b );

정의 int add ( int a, int b );

       {

return a + b ;

}

호출 add ( 10, 20 );

//


함수의 정의를 내려보자!


2개의 함수로 만든 프로그램이다.

주석을 보면 알듯 2가지의 함수가 쓰여 계산되는 과정을 알 수 있다.


add라는 함수로 예시를 들어 보자. add라는 함수는 두 값을 저장한것을 temp라는 곳에 저장을 하는 함수이다.

이처럼 따로 계산을 처리시키는 함수를 생성 할 수 있다.


int add ( int x , int y )

{

// 함수의 내용 !

}


앞부터 int는 반환형 이며 다음 붙게 되는 add는 함수명이다.

int x , int y 는 매개변수이며 이후 안에 내용이 함수를 처리하게 될 내용이다.


함수유형?!

함수에는 다양한 함수 형태가 있다.

매개변수가 없을때나 반환형이 없거나 매개변수와 반환형 모두가 없을 경우가 있으며,


매개변수가 없는 경우 - int get_pos(void); 또는 int get_pos()

// 호출할 때 인수 없이 괄호만 사용한다.



반환형 변수가 없는 경우 - void print_char(char ch, int cnt);

// 반환할 때 return문을 쓰지않거나 return문만 사용한다 !

// 호출문장을 수식의 일부로 쓸 수 없다.



둘다 없따 ! - void print_title(void);

// 두가지의 특징이 포함됨.



이렇게 선언과 특징을 알 수 있다.



재귀 호출함수가 또 있는데 이는


void rec_func() {  .... rec_func (); .... }

// 함수 안에 재귀 호출을 멈추는 조건이 있어야 한다.




이러한 선언과 특징을 가진다.


// 어디까지나 선언문은 예시일 뿐이다.



'0x0300 : Study > 0x0304 : Programming' 카테고리의 다른 글

Cpp 기초 (A+B 응용화)  (0) 2017.05.24
NASM - LD 컴파일 후 실행  (0) 2017.05.13
C - 배열과 포인터  (0) 2016.06.14
C - 포인터  (0) 2016.06.13
C - 배열  (0) 2016.06.13