본문 바로가기

c

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형을 주로 이용 한다. 위 의 예문을 일반.. 더보기
공용체 ●공용체 공용체(Union)란 서로 다른 자료형을 가진 데이터들이 동일한 기억장소를 “공유”하며 기억되는 형태를 말한다. ◎공용체의 정의 union union-name{ field-type field-name; field-type field-name; }; 이는 구조체 와 명령어 외엔 별반 다를게 없다 하지만 구분이 되는 것은 기억장소가 하나만 만들어 진다는 점이다. ex) union union-name{ long int i_value; float f_value; }; 라는 두 개의 공용체 필드를 만들었다고 한다면 이 기억 할당은 아래의 그림과 같이 이루어 진다. 4바이트로 할당 구조체는 필드 수만큼 매모리가 할당되지만 공용체는 단하나의 매모리가 할당된다. 그리고 i_value와 f_value가 동시에 .. 더보기
구조체 ●구조체 한 개체와 관련된 서로 다른 데이터 형들을 묶어서 하나의 자료형으로 표현한 것이다. 이때 한 개체는 서로 데이터 형들이 다르다 이를 묶어서 자료형을 만든다는 의미이다. ◎구조체 정의 struct structure-name{ field-type field-name; field-type field-name; (자료형) (변수명) }; 이때 정의는 반드시 메인함수 밖에서 해줘야한다. ex)struct student{//반드시 매인함수 밖에 정의 해준다... int number;//number을 int 형으로 정의 char name[30];//name을 char형으로 정의 int year;//year을 int 형으로 정의 }; 이 정의에서 구조체 명은(structure-name)생략이 가능하다. 하지만.. 더보기