티스토리 뷰
본문 들어가기전)
저번 포스팅에서 scanf함수의 주소에 대하여 자세히 다루겠다는것이 생각나 vi 에디터로 깡코딩 한 것중 일부인데 가져왔습니다.
위의 19번 라인부터 23번 라인에 대해 자세히 설명을 들어 보충하겠습니다.
19번 라인 : i가 0부터 SIZE까지 반복되는 포루프를 선언함
20번 라인 : 반복문의 시작 중괄호
21번 라인 : 배열의 i번째 원소에 정수를 입력받음,
scanf함수의 사용, scanf함수는 두가지의 인자(형식지정자, 주소값)을 받아 들입니다.
p.195: 만일 주소연산이 아닌 변수로 기술하면 입력값이 저장될 주소를 찾지 못해 오류가 발생한다
scanf(“형식 지정자(%d, %u, %c 등등…)” ,값을 저장할 변수의 주소값( &(변수명), 포인터변수 등등…) ) ;
이때 pary[i]자체가 주소값이므로 주소연산자&없이 기술해야합니다.
만약 &pary[i] 라고한다면 주소값의 주소값이 되므로 원하는 결과를 출력할수 없습니다.
22번 라인 : scanf를 통해 초기화 시킨 포인터배별 pary가 a,b,c를 가리키기 때문에 출력은
Printf(“%d %d %d”, *pary[0], *pary[1], *pary[2]); 과 동일한 결과를 얻을수 있습니다.
23번 라인: 반복문의 종료 중괄호
------------------------------------------------------------------------------------------------------------------------------------------------------
이제 다시 포스팅 주제로 돌아오겠습니다.
C언어를 주제로 한 네 번째 포스팅은 배열포인터와 배열의 관계에 대하여 다루어보겠습니다.
포인터와 배열은 밀접한 관계가 있습니다. 이번엔는 포인터와, 배열, 주소, 주소연산자 등 복합적인 내용들에 대하여
찬찬히 하나씩 다루어보겠습니다.
이번에도 역시 예제 문제들을 통해 살펴 보겠습니다.
<C 예제문제 5번 - 다음과 같이 일차원 배열을 복사하여 결과를 알아보는 프로그램을 작성하시오>
-배열 a의 첫 번째 원소부터 n번째 원소까지 같은 순서대로 배열 b로 값을 복사
-결과인 배열 b를 모두 출력
Int a[] = {4,7,9,3,6};
Int b[] = {10,20,30,40,50,60};
해결 과정)
이 문제 에서 a배열의 값을 모두 b배열에 복사하여 붙여넣으려고 하니 두배열의 사이즈가 다른 것을 알아차렸습니다.
배열 a는 원소의 개수가 5개인 배열이었고, 배열b는 원소의 개수가 6개인 배열이었습니다.
처음에는 b배열의 사이즈만큼 반복문을 돌려 a배열을 붙여넣은후 출력하니 b[5]의 값이 쓰레기값으로 변하게 되었습니다.
그래서 b배열의 사이즈만큼 출력을 하되 복사는 a배열의 사이즈만큼 진행하게 되었습니다.
다음은 같은문제를 포인터를 사용하여 해결해보겠습니다.
먼저 포인터변수수 pa, pb를 선언해준후 초기화 되어있던 배열 a 와 b를 가리키게했습니다
배열은 자체가 주소값이게 때문에 &(주소연산자)를 붙이지 않고 초기화합니다.
int* pa = a;
int* pb = b;
그리고 포인터값을 하나씩 증가시키며 값을 복사하는 과정으로 대체 하였습니다.
for (int i = 0; i < sizeof a / sizeof(a[0]); i++) {
*(pb+i) = *(pa+i);
}
for (int i = 0; i < sizeof b / sizeof(b[0]); i++) {
printf("%d ", *(pb+i));
}
전체 코드)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int a[] = { 4,7,9,3,6 };
int b[] = { 10,20,30,40,50,60 };
int* pa = a;
int* pb = b;
printf("<포인터를 사용하지 않은 배열 복사 결과>\n");
for (int i = 0; i < sizeof a / sizeof(a[0]); i++) {
*(pb+i) = *(pa+i);
}
for (int i = 0; i < sizeof b / sizeof(b[0]); i++) {
printf("%d ", *(pb+i));
}
printf("\n\n<포인터를 사용한 배열 복사 결과>\n");
for (int i = 0; i < sizeof a/sizeof(a[0]); i++) {
b[i]= a[i];
}
for (int i = 0; i < sizeof b / sizeof(b[0]); i++) {
printf("%d ", b[i]);
}
return 0;
}
결과 콘솔)
<C 예제문제 6번 - 다음과 같이 일차원 배열의 동등함을 검사하여 그 결과를 알아보는 프로그램을 작성하시오>
Int a[] = {4,7,9,3,6};
Int b[] = {4,7,9,3,6};
Int b[] = {10,20,30,40,50};
Int b[] = {4,7,9,3,7};
배열 a와 b의 배열크기가 다르면 다른 배열이며, 같으면 순차적으로 원소 값이 모두 같으면 “같은 배열”이고, 하나라도 다르면 “다른배열”
해결 과정)
배열의 크기를 검사하는 변수와 배열의 원소가 모두 동일한지 검사하는 변수를 두가지 선언하였습니다.
int sameSize=0; //배열의 크기가 같다면 1
int sameElem = 0; //배열의 원소가 모두 동일하다면 1
마치 자바에서 boolean 변수타입처럼 0일 때 false 1일 때 true입니다.
먼저 배열전체크기를 원소의 크기로 나눠준 배열의 크기값을 비교합니다.
if (sizeof a / sizeof(a[0]) == sizeof b1 / sizeof(b1[0])) {
sameSize = 1;
}
두배열의 크가값이 서로 같다면 sameSize라는 변수에 1을 초기화해주고 원소 검사로 넘어갑니다
만야 다르다면
else printf("배열의 크기가 다름으로 일치하지 않습니다\n두배열은 서로 동일하지 않습니다.");
배열이 일치하지 않는다는 구문을 출력후 종료합니다.
다음은 원소 검사입니다. 포인터를 사용하지않고 각원소를 비교하는연산을 수행하였고 코드를 통해 예시들겠습니다.
if (sameSize == 1) {
printf("배열의 크기는 같습니다. 원소의 값을 순차적으로 검색해보겠습니다.\n\n");
for (int i = 0; i < sizeof a / sizeof(a[0]); i++) {
if ((a[i]) == (b1[i]))
printf("%d번째 원소 일치\n", i);
sameElem = 1;
}
else {
printf("%d번째 원소 불일치\n", i);
sameElem = 0;
}
}
}
만약 배열의 크기 가 같다면 배열크기 만큼 반복하는 반복문을 통해 각원소의 동일 여부를 검사합니다. 각원소가 동일할때는 계속 sameElem변수를 1로 초기화하지만 다를경우엔 sameElem을 0으로 초기화 합니다.
이때 배열을 이동하는 과정을 포인터를 사용하여 표현한다면
if (*(ap+i)) == (*(b1p+i))) {
printf("%d번째 원소 일치\n", i);
sameElem = 1;
}
이런식으로 포인터변수의 주소값에 i를 더하며 다음 위치로 이동하는 연산을 수행하였습니다.
마지막으로 변수의 크기동일 여부를 검사한 sameSize변수와 각 원소의 일치여부를 검사한 sameElem변수의 참거짓을 둘다 참이어야 1이되는 And연산으로 묶어주어 최종 일치여부를 판단하였고 결과를 출력하였습니다.
if (sameSize && sameElem) {
printf("\n두배열은 서로 동일합니다.\n");
}
전체 코드)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int sameSize=0;
int sameElem = 0;
int a[] = { 4,7,9,3,6 };
int b1[] = { 4,7,9,3,6 };
int b2[] = { 10,20,30,40,50,60 };
int b3[] = { 4,7,9,3,7 };
printf("\n<포인터를 사용하지 않은 배열 일치검사 결과>\n");
if (sizeof a / sizeof(a[0]) == sizeof b1 / sizeof(b1[0])) { //다른 배열 검사시 바꿔주는 라인
sameSize = 1;
}
if (sameSize == 1) {
printf("배열의 크기는 같습니다. 원소의 값을 순차적으로 검색해보겠습니다.\n\n");
for (int i = 0; i < sizeof a / sizeof(a[0]); i++) {
if (a[i] == b1[i]) { //다른 배열 검사시 바꿔주는 라인
printf("%d번째 원소 일치\n", i);
sameElem = 1;
}
else {
printf("%d번째 원소 불일치\n", i);
sameElem = 0;
}
}
if (sameSize && sameElem) {
printf("\n두배열은 서로 동일합니다.\n");
}
else printf("\n서로 동일하지않은 원소가 발견되었습니다.\n두배열은 서로 동일하지 않습니다");
}
else printf("배열의 크기가 다름으로 일치하지 않습니다\n두배열은 서로 동일하지 않습니다.");
return 0;
}
(포인터 사용 O)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int sameSize=0;
int sameElem = 0;
int a[] = { 4,7,9,3,6 };
int b1[] = { 4,7,9,3,6 };
int b2[] = { 10,20,30,40,50,60 };
int b3[] = { 4,7,9,3,7 };
int* ap = a;
int* b1p = b1;
int* b2p = b2;
int* b3p = b3;
printf("\n<포인터를 사용한 배열 일치검사 결과>\n");
if (sizeof a / sizeof(a[0]) == sizeof b1 / sizeof(b1[0])) { //다른 배열 검사시 바꿔주는 라인
sameSize = 1;
}
if (sameSize == 1) {
printf("배열의 크기는 같습니다. 원소의 값을 순차적으로 검색해보겠습니다.\n\n");
for (int i = 0; i < sizeof a / sizeof(a[0]); i++) {
if (*(ap + i) == *(b1p + i)) { //다른 배열 검사시 바꿔주는 라인
printf("%d번째 원소 일치\n", i);
sameElem = 1;
}
else {
printf("%d번째 원소 불일치\n", i);
sameElem = 0;
}
}
if (sameSize && sameElem) {
printf("\n두배열은 서로 동일합니다.\n");
}
else printf("\n서로 동일하지않은 원소가 발견되었습니다.\n두배열은 서로 동일하지 않습니다");
}
else printf("배열의 크기가 다름으로 일치하지 않습니다\n두배열은 서로 동일하지 않습니다.");
return 0;
}
결과 콘솔)
'Language > C' 카테고리의 다른 글
C - 1, 2차원 배열 포인터 & 함수 (0) | 2021.01.27 |
---|---|
C - 전위 연산 & 후위 연산 (0) | 2021.01.27 |
C - Array&ForLoop, 배열과 포문 (0) | 2021.01.27 |
C - Exchange of integer variable, 변수의 교환 (0) | 2021.01.27 |
C - Basic(scanf, printf, if, else if), 기본함수 (0) | 2021.01.27 |