보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.
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 |
배열명 - 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는 배열의 요소 수를 받아 저장하고 그만큼 반복을 한다.
// 출력할 배열 요소수가 바뀌어도 그에 맞춰 모든 배열 요소의 값이 출력이 가능하다는 것이다.
입력 함수는 데이터를 저장할 배열의 위치가 필요하다.
// 배열에 값 입력하는 함수는 함수 안에서 포인터 직접 사용.
배열에 값을 입력하는 함수이다.
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 |
변수의 메모리 주소 저장하는 변수
// 변수?
/ 메모리 상의 저장공간
/ 그 위치를 알면 사용할 수 있음
//위치값 - 주소
포인터와 연산자
주소 연산자 - 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로 나타난다.
크기가 모두 같으므로 대입 연산 쉽게 생각 할 수 있다.
// 포인터는 가리키는 변수의 형태가 같을 때만 대입
// 포인터끼리 대입 연산 수행
/ 여러 개의 포인터로 같은 데이터 다루는 것이 가능
위의 코딩은 허용되지 않은 포인터의 대입이다.
변수 사용하는 가장 쉬운 방법은 이름을 쓰는 것
// 포인터를 사용하려면 추가적인 변수 선언 필요
// 각종 연산 수행해야 하므로 필요한 곳에만 사용
포인터를 사용한 두 변수의 값 교환이다.
swap이라는 이름으로 매개변수로 포인터를 선언하여 두 변수의 값을 바꿨다.
swap 함수에서 main함수의 a,b를 이름으로 직접 사용하는 방법
이 과정에서 a, b를 이름으로 직접 사용하는 방법을 사용했기 때문에 선언되지 않는 식별자로 에러가 뜬다.
// 그래도 기본적인 배열에서 교환하는 것 이랑 비슷비슷해서 .. 자세한건 생략!
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 |
각 저장 곤간을 이름과 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 연산자를 사용한 배열의 예시이다.
cnt = sizeof(score) / sizeof(score[0]);
cnt는 배열 요소 수 (5) 가 되고 score은 배열 전체 크기인 20바이트 이며 배열 요소 하나의 크기는 score[0]이 4바이트로 주어진다.
문자열은 문자의 연속
// 문자열 저장할 때는 char형 배열 사용
가장 기본적인 예시이다.
문자열 끝에 널 문자가 없는 경우가 있다
이러한 경우는 쓰레기 값을 문자열로 출력 하기도 한다...
이처럼 뒤에 빈공간이 있다면 글자가 이상한 쓰레기 값이 출력 되는 것을 확인 할 수 있다.
// 물론 테스트는 하지 않았습니다 ^ㅡ^...
char형 배열은 문자열 저장하는 변수의 역할을 한다.
// 초기화 된 이후에도 새로운 문자열 저장이 가능
// 문자열의 길이가 다를 수 있음
strcpy함수를 활용한 문자열 대입하는 배열 예제이다.
문자열 입출력 함수로 gets, puts가 있다.
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 |
선언 - 정의 - 호출 로 세 가지의 상태로 사용할 수 있다.
//
선언 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 (); .... }
// 함수 안에 재귀 호출을 멈추는 조건이 있어야 한다.
이러한 선언과 특징을 가진다.
// 어디까지나 선언문은 예시일 뿐이다.
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 |