본문 바로가기

programming language/C 언어

(41)
열혈 c프로그래밍 13-1(4) 배열의 앞과 뒤를 가리키는 포인터 변수 2개를 선언해서 이를 활용해 저장된 값의 순서를 6 5 4 3 2 1로 바꾸어 출력하는 문제이다. 처음 풀이인데 문제도 잘못 읽었고, 문제 해결도 엉망인 문장들이다. #include int main(void) { int arr[6] = { 1,2,3,4,5,6 }; int* front = arr; int* back = &arr[5]; *front = arr[0]; arr[0] = *back; *back = *front; *(front + 1) = arr[1]; arr[1] = *(back - 1); *(back - 1) = *(front - 1); *(front + 2) = arr[2]; arr[2] = *(back - 2); *(back - 2) = *(front..
열혈 c프로그래밍 13-1(3) 포인터 변수 ptr에 저장된 값을 감소시키는 형태의 연산을 기반으로 모든 배열 요소에 접근하여, 배열에 저장된 모든 정수를 더하여 그 결과를 출력하는 프로그램을 작성해보는 문제이다. #include int main(void) { int arr[5] = { 1, 2, 3, 4, 5 }; int* ptr = &arr[4]; int sum = 0; int i = 0; for (i = 0; i < 5; i++) { sum += *(ptr--); } printf("%d", sum); return 0; } ptr--는 후위 감소 이기때문에 sum += *(ptr--);에서 += 연산의 진행 후에 후위 감소가 이루어진다.
열혈 c프로그래밍 13-1(2) 이번에는 포인터 변수 ptr에 저장된 값을 변경시키지 않고, ptr을 대상으로 덧셈 연산을 하여, 그 결과로 반환되는 주소 값을 통해서 모든 배열 요소에 접근하여 값을 2씩 증가시키는 문제이다. #include #define SIZE 5 int main(void) { int arr[SIZE] = { 1 , 2, 3, 4, 5 }; int* ptr = arr; int n = 0; for (n = 0; n < SIZE; n++) { *(ptr + n); printf("%d", ptr[n] + 2); } return 0; } ptr++; 은 ptr에 저장된 값 변경하지 말자 했으므로 사용하지 못한다. #include #define SIZE 5 int main(void) { int arr[SIZE] = { 1,..
열혈 c 프로그래밍 문제 13-1(1) 처음 문제를 접근할 때, 문제를 잘못 읽고 푼 풀이인데, 그런 겸에 포인터 연산에 관한 개념 정리를 해보았다. #include int main(void) { int arr[5] = { 1 , 2 , 3 , 4 ,5 }; int* ptr = arr; printf("첫번째 요소: %d\n", *ptr); ptr++; printf("두번쨰 요소: %d\n", *ptr); ptr++; printf("세번째 요소: %d\n", *ptr); ptr++; printf("네번째 요소: %d\n", *ptr); ptr++; printf("5번째 요소: %d\n", *ptr); printf("\n"); return 0; } 이 문장을 통해 *ptr이 배열의 요소값에 접근한다라는 점을 알 수 있다. 그렇다면 밑의 문장도 출..
c언어 포인터와 배열 #include int main(void) { int num = 7; int* pnum; pnum = &num; ........ } 포인터 변수란? 메모리의 주소 값을 저장하기 위한 변수이다. 그러면 여기서 포인터 변수는 *pnum 일까, pnum일까? 바로 pnum이다. 위 코드를 보면 num의 주소 값을 포인터 변수인 pnum에 저장하고 있는 것을 볼 수 있다. 이러면, num의 시작 번지 주소 값이 포인터 변수 pnum에 저장이 되고, 이를 포인터 변수 pnum이 int형 변수 num을 가리킨다.라고 할 수 있다. 그렇다면 *pnum은 무엇일까? 우선,* 연산자는 포인터가 가리키는 메모리 공간에 접근할 때, 사용하는 연산자이다. 그러므로, *pnum은 포인터 변수 pnum이 가리키는 메모리 공간인 ..
구조체의 비교 #include struct point { int x; int y; }; int main(void) { struct point p1; struct point p2; p1.x = 30; p1.y = 10; p2.x = 30; p2.y = 10; if (p1 == p2) { printf(" p1과 p2가 같습니다."); } return 0; } 이 코드는 오류가 발생하는데, 그 이유는 : 구조체는 아무리 같은 구조체 타입(struct point)이라 하더라도, 두 개의 변수 자체를 직접 비교하는 것은 불가능하다.!! #include struct point { int x; int y; }; int main(void) { struct point p1; struct point p2; p1.x = 30; p1.y ..
구조체의 활용 사각형 넓이 둘레 구하기 들어가기에 앞서, 학생정보 시스템을 구현한다고 해보자. 학생이라는 틀이 필요 그 틀 안에는 학번, 이름, 학점 등이 들어가 있을 것이다. struct student { int number; char name [10]; double score; }; 의 형식으로 구조체를 만들 수 있다. 따로따로 이름 학번 점수를 조합해서 학생정보를 만들 수 있는데 왜, 구조체를 만들까? 그 답은 관리가 편하다는 이유가 있다. 실제로 학생정보 시스템 구현한다고 했을 때 서버를 구축하고 그 안에서 데이터베이스를 만들 것이다. 데이터 베이스는 일반적으로 테이블을 만들어 데이터 관리를 한다. 테이블에는 학번 이름 학점 등 들어가 있고, 실질적으로 프로그래밍 상에서 서버에 접근해서 데이터베이스에서 학번 이름 학점을 일대일 매칭 해..
c언어 구조체 이해 우선 구조체는 객체 지향 프로그래밍 언어에서 말하는 클래스의 모체가 되는 것으로 여러 개의 자료형을 묶어서 새로운 자료형을 만들 수 있는 방법이다. 학생정보 구조체 만들기 #include #include struct student { >>하나의 구조체를 만들어줌 int number; char name[10]; double grade; grade>>학점 }; int main(void) { struct student s; s.number = 20150001; strcpy(s.name, "홍길동"); s.grade = 4.5; //여기까지 s라는 이름의 student구조체 변수는 이런 식으로 각각의 변수에 대한 값을 가지게 된 것이다 printf("학번: % d\n", s.number); printf("이름:..