|
나오미 님이 쓰신 글 :
: : #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는 배열로 선언되었습니다.
: 그러므로 배열첨자나 포인터를 사용하지 않고 바로 변수를
: 읽으려 한다면 메모리번지 값이 출력이 되겠지요.
:
: 그렇다면 어떻게 바뀌어야 할까요????
:
|