|
: #include <stdio.h>
: void main (void)
: {
: int val[3][3]={10,30,50,60,20,70,90,40,80};
: void display(int[][3]);
: display(val);
: }
:
: void display(int nums[3][3])
: {
: int i,j,nums2[9];
: for(i=0;i<3;i++){
: for(j=0;j<3;j++)
: nums2[3*i+j]=nums[i][j];
: printf("%d",nums2);
: }
:
:
: }
:
포인터와 배열에 대한 이해가 필요합니다.
display함수 내에서 정수형 자동 변수 nums2를 9개의 배열로 선언하였습니다.
일단 생각하기 쉽게 char로 바꾸어서 생각해보죠.
흠.. 왜냐면 정수형 변수이므로 당연히 숫자가 표시된다고 생각할 수
있는 부분을 배재하기 위해서입니다.
char cTestChar = 'a';
printf("%c",cTestChar);
위의 문장은 화면에 a 라는 캐릭터를 출력합니다.
배열로 선언한다면
char cTestChar[9] = {'a', 'b', 'c', 'd', 'e','f','g','h','i'};
printf("%c",cTestChar);
값이 출력되기는 하지만 읽을 수 없는 캐릭터가 표시될수도 있습니다.
왜냐하면 cTestChar가 배열로 선언되어있기때문에 메모리에 할당된
영역의 주소값을 출력하게 됩니다. 그런데 출력 형태는 %c 즉 캐릭터
형태로 출력하라 하였기에 ascii 테이블에 있는 어떤 하나를 출력하게
됩니다. 어떤값의 아스키값이 나온다라는걸 예측할 수 있지만
그러한 부분은 생략하기로 하죠.
이제 위 문장의 출력 형태를 바꾸어 보죠.
char cTestChar = 'a';
printf("%d",cTestChar);
위의 문장은 97을 출력합니다. 아스키 테이블에 'a'가 97로 정의 되어있기 때문입니다.
char cTestChar[9] = {'a', 'b', 'c', 'd', 'e','f','g','h','i'};
printf("%d",cTestChar);
이번엔 어떤값이 나올까요?
역시 숫자가 나옵니다. 하지만 출력되는 숫자는 원하던 97이 아닌
임의의 숫자입니다.
바로 이 숫자가 할당된 메모리 번지입니다.
이제 이렇게 생각하십시요.
배열로 선언을 하였거나 포인터변수를 선언하였을 경우
해당 변수에는 항상 메모리의 번지 값이 들어있다.
그럼 이제 배열과 포인터는 호환된다는걸 감잡으셨을겁니다.
배열을 포인터로 변환하기 위해서는 마지막 배열 첨자를
변수의 앞으로 가져와 '*'로 표시해주면 됩니다.
그래서 다음과 같은 식들이 성립됩니다.
*(cTestChar ) == cTestChar[0] == 0[cTestChar]
*(cTestChar +1) == cTestChar[1] == 1[cTestChar]
*(cTestChar +2) == cTestChar[2] == 2[cTestChar]
:
:
이정도로 cTestChar에 주소값이 있다는 것이 이해가 되셨는지
모르겠네요. 위의 식을 보면 쉬울거 같기도 한데...제 생각엔..^^;;
(좀 더 정확히 이야기 하자면 이것도 아닙니다.
단지 그렇게 표현할 뿐이죠... 그냥 쉽게 생각하자구요)
그럼 다음 문장의 출력문은
char cTestChar[9] = {'a', 'b', 'c', 'd', 'e','f','g','h','i'};
printf("%d",cTestChar);
printf("%d",*cTestChar);
이거나
printf("%d",cTestChar[0]);
혹은
printf("%d",0[cTestChar]); /* 이 표현은 참고적인겁니다. */
로 표현하면 97이라는 값이 출력될겁니다.
이제 원점으로 돌아가서 함수 내부의 출력문을 살펴보죠.
printf("%d",nums2);
nums2는 배열로 선언되었습니다.
그러므로 배열첨자나 포인터를 사용하지 않고 바로 변수를
읽으려 한다면 메모리번지 값이 출력이 되겠지요.
그렇다면 어떻게 바뀌어야 할까요????
|