별표 하나는 대괄호 하나에 해당한다.
2차원 배열을 포인터로 접근했을 때 별(*)표 하나는 행을 대상체로 하므로 배열 요소 자체의 값을 구할 수 없다.
포인터 변수 더하기 정수는 행 단위로 움직인다.

/* *( imsip + 1 ) 과 *imsip + 1의 차이 */
#include <stdio.h>
main() {
  int imsi[ 2 ][ 3 ] = { { 3, 5 }, { 12, 54 }, { 534, 923 } };
  int ( *imsip )[ 2 ];

  imsip = imsi;

  printf( "%#010x %#010x\n", *imsip, *imsip + 0 );
  printf( "%#010x %#010x\n", *( imsip + 1 ), *imsip + 1 );
  printf( "%#010x %#010x\n", *( imsip + 2 ), *imsip + 2 );
}
// output
0x8047d10 0x8047d10
0x8047d18 0x8047d14
0x8047d20 0x8047d18

*imsip, *imsip + 0 은 차이가 없다.
*( imsip + 숫자 ) 는 imsip + 숫자와 같고 이는 행 단위로 움직인다.
*imsip + 숫자는 배열 요소의 증가를 뜻하므로 4바이트씩 증가한다.

int imsi[ 2 ][ 3 ] = { { 3, 5 }, { 12, 54 }, { 534, 923 } };
int ( *imsip )[ 2 ];

imsip = imsi;

// 다음 포인터 변수를 사용하여 출력
printf( "%d\n", *( *( imsip + 0 ) + 0 ) );  // 3
printf( "%d\n", *( *( imsip + 0 ) + 1 ) );  // 5
printf( "%d\n", *( *( imsip + 1 ) + 0 ) );  // 12
printf( "%d\n", *( *( imsip + 1 ) + 1 ) );  // 54
printf( "%d\n", *( *( imsip + 2 ) + 0 ) );  // 534
printf( "%d\n", *( *( imsip + 2 ) + 1 ) );  // 923
// 가장 안쪽의 괄호 안의 수치는 행, 바깥쪽은 행의 배열 요소와 관련

// 다음과 같이 변경 가능
printf( "%d\n", *( imsip[ 0 ] + 0 ) );  // 3
printf( "%d\n", *( imsip[ 0 ] + 1 ) );  // 5
printf( "%d\n", *( imsip[ 1 ] + 0 ) );  // 12
printf( "%d\n", *( imsip[ 1 ] + 1 ) );  // 54
printf( "%d\n", *( imsip[ 2 ] + 0 ) );  // 534
printf( "%d\n", *( imsip[ 2 ] + 1 ) );  // 923

// for문 사용
for ( i = 0; i < 3; i++ )  // 행의 길이
  for ( j = 0; j < 2; j++ ) { // 열의 길이
   printf( "%d\n", *( imsip[ i ] + j ) );
  }
}


int ( *imsip )[ 2 ] vs int *temp[ 2 ]

#include <stdio.h>
main() {
  int ( *imsip )[ 2 ];
  int *temp[ 2 ];

  printf( "&imsip %#010x\n", &imsip );
  printf( "&temp[ 0 ] %#010x\n", &temp[ 0 ] );
  printf( "&temp[ 1 ] %#010x\n", &temp[ 1 ] );
}
// output
&imsip 0x8047d24
&temp[ 0 ] 0x8047d18
&temp[ 1 ] 0x8047d1c

temp 라는 것은 포인터를 저장할 수 있는 영역이 두 개인 것이다. (temp[ 0 ], temp[ 1 ])
그리고 temp 자체는 배열명이 된다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret