프로그래밍

116

상수 형태의 문자열을 가리키는 포인터

배열에서도 문자열을 다룰 수 있듯이, 포인터에서도 가능합니다. 포인터에서 동적 할당을 사용하여 읽기/쓰기 전용으로도 가능하지만, '읽기' 전용이 필요한 경우에 동적 할당을 쓰지 않고 "상수 형태의 문자열"을 사용해도 됩니다. 문자열 시점에서 배열과 포인터가 다른 점 char str[] = "my string"; char * str2 = "Your string"; 첫 번째 줄인 배열은 배열을 기반으로하는 '변수 형태의 문자열'입니다. 포인터를 기반으로 문자열을 선언하는 것도 가능합니다. 두 번째 줄인 포인터는 메모리공간을 수동으로 만들어주지 않았기 때문에 "Your string"이라는 문자열은 자동으로 할당되고 문자열의 첫문자 Y의 주소값이 반환이 되어 str2에 대입됩니다. Y의 메모리주소가 반환이 되어..

프로그래밍/C 2019.04.17 Plorence

포인터 연산

포인터 연산 포인터 연산이란 말그대로 포인터를 대상으로 하는 연산입니다. *연산자를 사용할경우에는 포인터가 지시하고 있는 메모리공간에 접근하여 연산합니다. 연산자는 +=,-=,++,--,*,/ 등 모든 연산자를 사용할 수 있습니다. int * ptr; ptr = ptr + 1; ptr+1을 하게되면 포인터 변수 ptr이 가리키는 대상이 아닌 포인터 변수 ptr에 저장되어있는 주소값자체를 1 올려줍니다. 근데 여기서 특이한 점이 있습니다. 실제로는 진짜 1이 아니고 포인터형 타입의 사이즈만큼 올려줍니다. 즉 2를 올려준다면 '포인터형의 사이즈 * 2'값을 주소값에서 더해주는겁니다. int 형 포인터 변수 ptr가 000004를 가지고 있고 ptr + 1해준다면 포인터 변수 ptr는 000008을 가지게 됩..

프로그래밍/C 2019.04.17 Plorence

C언어 포인터

C언어의 꽃, 포인터(Pointer) 포인터는 C언어의 꽃이라고 할 수 있으며 정말 많이 쓰입니다. 변수는 메모리 영역에 저장돼있고 메모리 주소는 이 변수가 메모리 영역 중 어디에 위치해있느냐를 나타냅니다. 이 메모리 주소를 가지고 포인터를 사용하여 읽기/쓰기가 가능합니다. 포인터 변수란 메모리의 주소 값을 저장하기 위한 변수입니다. 포인터의 개념 "포인터는 어렵다"는 써먹기 어려운 거지, 개념 자체는 매우 쉽습니다. 이점은 C언어의 다른 문법에도 어느 정도 해당하는 말입니다. 변수가 메모리에 할당될 때 어디에 위치해있냐를 알기 위해 특별한 연산자가 제공됩니다. 포인터는 이 위치 값을 참조하여 접근해서 읽기/쓰기를 하는 겁니다. 예로 하나 들어보자면 청와대라고 하면 정확히 위치가 어디인지 모르시는 분이 ..

프로그래밍/C 2019.04.17 Plorence

C언어 포인터와 배열의 관계

배열의 이름은 포인터입니다. 단 그값을 바꿀 수 없는 '상수 형태의 포인터'입니다. 들어가기 전에,서식문자 %p 는 주소값의 출력에 사용되는 서식문자입니다. 포인터와 배열의 관계 배열 원소에 접근할때 내부에서 포인터를 사용합니다.12345678910#include int main (void){ int arr[3] = {0,1,2}; printf("%p \n",arr); printf("%p \n",&arr[0]); printf("%p \n",&arr[1]); printf("%p \n",&arr[2]); return 0;} 출력결과는 다음과 같습니다.1234000000000062FE40000000000062FE40000000000062FE44000000000062FE48 (해당 결과는 PC마다 다름. 참고용..

프로그래밍/C 2019.03.19 Plorence

C언어 배열 (1차원만 설명)

배열 배열은 다수의 데이터를 저장하고 처리하는 경우에 유용하게 사용할 수 있는 것이 배열입니다.12345678#include int main (void){ int floor101,floor102,floor103,floor104; //배열 미사용시 int floor201,floor202,floor203,floor204; //배열 미사용시 int oneFloArr[4]; //배열 사용시 int twoFloArr[4]; //배열 사용시} 장점은 코드가 간결해지며,편리합니다. 만약 변수 1000개가 필요한다면 언제 1000개를 다만들까요? 아마 만들다가 그만둘겁니다. 1차원 배열 선언에 필요한 것 배열이름 자료형 길이정보 (반드시 상수여야 함.) 선언시1자료형 배열이름[길이정보]; 로 선언합니다. 1234567..

프로그래밍/C 2019.03.19 Plorence

C언어 재귀함수

재귀 함수(Recursion Function) 재귀함수는 자기 자신을 다시 호출하는 함수를 의미합니다.123456789101112#include void helloworld (int num){ if(num

프로그래밍/C 2019.02.24 Plorence

C언어 변수의 존재기간과 접근범위

C++에서도 해당되는 내용입니다. 변수(Variable) 함수내에 변수가 선언되었으면 그변수는 지역변수라고 부릅니다. 지역변수는 함수가끝나면 자동으로 소멸되고 함수가 호출될때 지역변수는 메모리공간에 할당됩니다. 12345678910111213#include void Funcprintf();/*지역변수는 함수내에서만 사용이 가능*/int main (void){ int num1 = 0; //변수 num1은 지역변수이다. main함수가 끝나면 자동으로 소멸된다. printf("%d",n1); //Funcprintf 에 있는 변수n1에서 저장된 정수값을 출력하는거지만 해당 지역변수는 Funcprintf함수내에서만 사용 가능하기때문에 에러}void Funcprintf(){ int n1 = 0; //변수 n1도 함..

프로그래밍/C 2018.12.20 Plorence

C언어 함수에 대해

함수(Function) 굳이 C언어가 아니더라도 대부분의 언어에서 많이 쓰이는게 함수입니다. 함수는 호출할때 여러가지 값도 받을 수 있고 호출한곳으로 값을 반환할 수도 있습니다. 유지보수면에서도 코드가 줄고 관리해야할 부분이 정해져있으니 좋습니다. 함수의 정의 방법 1234반환타입 함수이름(매개변수){함수의 몸체} 함수 사용의 장점 문제의 발생 및 프로그램의 요구사항 변경으로 인한 소스코드의 변경이 필요한 경우에,변경의 범위를 축소 및 제한할 수 있다.(앞에서 말한 관리해야할 부분이 정해져 있으니) 12345678910#include int main (void){ int num1,num2; num1 = printf("hello world \n"); num2 = printf("1234567 \n"); pr..

프로그래밍/C 2018.12.15 Plorence

C언어 goto문

goto문 goto의 의미는 프로그램의 흐름을 원하는 위치로 이동 하는겁니다. goto문은 코드를실행하다가 goto문을만나면 지정한 레이블로 넘어갑니다. goto rabbit: 을하면 rabbit:이 위치한 레이블로 이동하여 아래의코드를 실행합니다. 그럼 그전의 코드는 실행되지 않습니다. goto문에 대해서 논란도 많았습니다. 가장큰원인은 프로그램의 자연스러운 흐름을 방해하기 때문입니다. C언어와 같은 절차지향 프로그래밍 언어에서는 흐름을 복잡하게하거나 방해하는것은 아주 큰 단점 이기 때문입니다. 결국 goto문의 사용은 가급적 자제하거나,아예 사용하지말자는 결론을 내렸습니다. 물론 적절하게 써주면 좋습니다.1234567891011121314151617181920#include int main(void)..

프로그래밍/C 2018.12.14 Plorence

C언어 switch문

switch문 switch문은 사용자가 선택해서 원하는 방향으로 코드를 실행할 수 있습니다. (선택적 실행) 어느 특정 범위가 아닌 값이 정해져있다면 if문보다 깔끔할 수 있습니다. 사용방법 1234567891011121314151617181920switch(변수){case 1://실행영역break;case 2://실행영역break;case 3://실행영역break;case 4://실행영역break;case 5://실행영역break;default://실행영역}보통 변수타입은 int형이 쓰이고,변수값에따라 케이스 레이블 에맞는 코드를 실행합니다. 변수값이 1이라면 case 1의 실행영역을 실행합니다. case 1,2,3,4,5 이런식으로 있는데 이런걸 레이블(label)이라고 합니다. default 레이블..

프로그래밍/C 2018.12.13 Plorence

C,C++언어 break 와 continue문

break문 break문은 반복문의 탈출을 위해 사용합니다. 이때 break문을 실행하면 가장 가까이에 있는 반복문을 탈출합니다. 무한루프일때는 반드시 사용하거나 goto를 써서 강제로 이동시켜야 합니다. 12345678910111213#include int main(void){ int num1 = 0; while(1){ if(num1 > 1000){ break; // num1의 값이 1000이상이면 반복문을 탈출한다. } printf("%d \n",num1); num1++; } } while문은 무한루프상태이고 num++;을 써서 1씩올리는 코드이다. 적절하게 반복문을 탈출하기위해서 num1이 1000보다 크면 탈출하게되었다 이 예제를 실행해보면 마지막 숫자 1000을 출력하고나서 종료될것이다. con..

프로그래밍/C 2018.12.12 Plorence

C,C++ AES 암호화 예제

123456789101112131415161718192021222324252627282930313233343536#include #include #define CBC 1#define ECB 0#include "aes.h" int main(void) { int I, Len; char In[]="Hello AES128..."; BYTE Key[]={0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c}; BYTE EncBuff[80]; BYTE DecBuff[80]; printf("Testing AES128\n\n"); printf("OrgString: '%s'\n", In); Len=strl..

프로그래밍/C++ 2018.12.11 2 Plorence