본문 바로가기

Language/C

구조체 정의와 동시에 초기화 일반적으로 구조체는 멤버함수를 가지지 않기 때문에 생성자라는 개념이 없다. 실제 책을 찾아봐도 이러한 내용은 다루지 않더라. 그러나 생성자가 존재는 하더만 ?! 일단 깊게 파진 못하고 잊어버릴까 싶어 우선 포스팅 바로 .... typedef struct TESTSTR{int a;int b;}TESTSTR; 보통 위와 같이 사용하여 선언시 다음과 같이 초기화 한다. TESTSTR teststr = {10,11}; 이것도 머 나쁘진 않지만 멤버변수가 많다면 이짓도 여간 힘든일이 아니다. 그리고 할때마다 memset 또는 ZeroMemory 함수를 쓰는거도 귀찬고 잊어버려 쓰레기 값이 들어가는 경우가 허다하다. 그래서 생성자 같은 함수가 있으면 편리한 것!! 젠장...있었구나... 선언시 다음과 같이 해주면 .. 더보기
C/C++ 2차원 정적배열을 함수 매개변수로... 일반적으로 동적 배열은 매우 심플하게 Fun(int **a) 라는 형식을 사용하여 매개변수로 넘겨받는게 가능하다. 하지만 C와 C++에서 정적배열 int a[10][5] 을 넘겨줄때는 일반적인 포인터 전달방법이 에러가 난다. 왜이럴까나.ㄱ- ;; 어짜피 정적이든 동적이든 위치만 다를 뿐 배열자체가 포인터로 움직이게 되는데... 어째든 자꾸 잊어버리고 찾는 일이 잦아서 포스팅 ㄱ ㄱ 정적으로 배열을 선언 하였을때 매개변수로 넣는 방법은 간단하다. int a[10][5]; void fun(int (*a)[5]){} 행은 포인터로 받고 열은 인덱스로 받는 형식으로 넘기면 된다. 왜 이렇게 만들어 놨는지는 나중에 조사하면 다나와~ 더보기
for 끝에 세미콜론 (;) 을 찍으면? 일단 6.0 에서 확인해본 결과 에러는 아니다.ㅡㅡ; 이전에 이것때문에 선배가 2시간 동안 디버그를 해준적이 있었는데... 오늘 이걸 또 볼 줄이야... Test 해본결과(Visual Stdio 6.0 기준) void main() { int i = 0; for(i = 100; i > 20; i--); printf("%d\n",i); } 이 코드를 실행하면 i 는 20의 값을 같는다. 한마디로 for 밑의 라인을 하나도 실행하지 않고 오로지 for 함수 한라인만 실행하는 것이다. i 의 초기값 100을 시작으로 조건식을 거쳐 바로 i-- 를 실행 그리고 다시 조건식 다시 i-- 를 실행 이걸 조건식에 부합될때 까지 반복한다. 결과는 i = 20 으로 나온다. 만일 세미콜론을 풀게되면? printf() 가 .. 더보기
포인터 와 배열 ●포인터 와 배열 “배열명은 포인터 다!” 이말은 곧 배열명은 그 배열의 첫 번째 기억공간의 시작 주소 상수 이다. 이는 “첫 번째 배열의 주소 값“ 하고는 그 계념이 틀리다. ex)char arr[5]; char *ap = arr; 으로 선언 했다고 가정 한다면 ap == &arr[0] 라고 볼수가 있다. 여기서 arr은 첫 번째 기억공간의 주소값을 문자화 시킨것이라고 볼 수 있다. 이런 사실을 통해 다음과 같은 법칙이 성립한다. arr[0] == *(arr+0) == *(ap+0) == ap[0] ex)int ary[10]={1,2,3,4,5,}; int *ip = ary; printf("%u\n",ary);//3가지 모두 같은 값이다. printf("%u\n",ip); printf("%u\n",&a.. 더보기
포인터 연산 ●포인터 와 포인터 변수의 연산 포인터 와 포인터 변수의 연산은 상당히 제한적이다. 포인터 변수에 포인터를 할당할때는 가리키는 자료형이 일치해야만 한다. ex)int in; float *fp = ∈ //이는 불가능한 연산이다. ○포인터 또는 포인터 변수에 정수값을 더할수 있다. 예를 들어서int in; int *ip = ∈ in=100번지 ip=100번지이라는 포인터가 선언 되었다고 가정한다면 ip안에 in변수의 시작 주소값이 할당 될 것이다. 이를 100이라고 보자. 이면, 와 같다 여기서 ip+1;을 수행한다면 100+1이 수행 되는 것이 아니라 100+(1*4)가 연산이 되는 것이다. 여기서 한마디로 포인터 + 정수*sizeof(*포인터) 로 연산이 수행되는 것이다. 여기서 sizeof(.. 더보기
포인터 기본 응용 함수는 필요에 따라 x포인터를 리턴한다. ex)char *strcpy(char *des, char *src) char string1[80]' char string2[] = "Hanbit online"; char *sp; sp = strcpy(string1, string2); printf("%s\n",string1); printf("%s\n",sp); printf("%s\n",strcpy(string1, string2));//printf함수 내에서 바로 복사가 가능 ●NULL포인터 NULL포인터는 0번지를 가리키는 것이 아니라 아무 것도 가리키지 않음을 의미한다.(실제 NULL의 숫자값은 0이다.) NULL포인터 변수는 NULL로 초기화 하여 예상치 못한 프로그램의 오류를 방지한다. ●const 포인터 변.. 더보기
포인터를 매개변수로 함수의 인수 전달 방법은 간단하게 두가지가 있는데 call by value 와 call by reference이다. call by value 는 간단하게 말해서 전달 인수를 복사해서 넘겨주는 것이다. 이로 인해 메인함수의 원본 변수의 값이 보호가 될수 있지만, 전달되는 값이 많을 때는 함수의 사용이 비효율 적이다는 것이다. 아무리 많은 매개 변수를 넘겨줘도 돌아오는건 한 개 이상이 될 수 없다. 이런 문제점을 해결하는 것이 call by reference이다. 한마디로 포인터를 이용하여 주소를 참조하여 함수간의 매개 변수를 전달 하는 것이다. 전달하는 형식은 다음과 같다. main 함수에서 값을 넘겨줄 때 swap(&a,&b);//주소 연산자로 주소값 자체를 넘겨준다. swap 함수에서 값을 받을 때 s.. 더보기
포인터 ●포인터 ⦁포인터란 특정 기억공간 의 시작 주소값이다. 특정 기억공간 : 특정 자료형의 변수 ex) int a⟵a는 특정 자료형의 변수이다. 시작 주소값 : 자료형의 크기가 1바이트 이상일수 있기 때문이다. ⦁포인터는 자료형에 대한 정보를 담고 있다.(특정 자료형을 가리킨다) ⦁포인터는 일정크기를 갖는 정수값이다.⦁포인터는 가리키는 기억공간이 다를지라도 포인터 자체의 크기는 항상 일정하다. ex)char ch; printf("size of pointer : %d\n",sizeof(&ch)); printf("address : %p\n",&ch); 위의 예문은 포인터를 구해서 크기와 값을 출력하는 것이다. 첫 번째 &ch 는 1이 나올것이고 %p(주소값을 출력하는 변환지정자이다)값은 16진수로 ch의 주소가.. 더보기
응용자료형의 배열 ●응용자료형의 배열 ◎비트 필드 또는 팩키드 구조체 비트 필드 또는 팩키드 구조체를 사용하면 구조체의 저장공간을 최소화 할 수 있다. 구조체의 필드를 비트단위로 설정이 가능하다. struct struct-name{ field-type field-name : bit=number; ⦁ ⦁ ⦁ }; 형식은 구조체와 동일하지만 필드명 뒤에 (:)를 붙이고 비트 수를 입력한후 세미콜론을 입력한다. ex) struct item{ unsigned int lis : 1; /*항목이 목록 안에 있다면 참*/ unsigned int seen : 1;/*이 항목이 보여졌다면 참*/ unsigned int number : 14;/*항목 번호*/ 보통 비트 필드 구조체는 unsigned형을 주로 이용 한다. 위 의 예문을 일반.. 더보기
열거형 ●열거형 열거형은 이름을 원소로 갖는 특정 자료형이다. 이값은 이름(tag)로 참조한다. 컴파일러는 내부적으로 각 태그에 정수값을 하나씩 할당한다. enum enum-name{tag1,tag2,tag3.....} variable-name; ex)typedef int week_dats;//week_day 데이터 정의 const int SUNDAY = 0; const int MONDAY = 1; const int TUEDAY = 2; const int WEDNESDAY = 3; const int THURSDAY = 4; const int FRIDAY = 5; const int SATYRDAY = 6; week_day today = TUESDAY; 위의 예문은 실제사용의 예문이다. 하지만 이런 방법은 상당히 .. 더보기