포인터 배열

question의 이미지

#include

void main(){
char data[2][2];
char (*p)[2] = data;

printf("data : %x\n", data);
printf("*p : %x\n", *p);
}
data : 배열 시작 주소 값
*p : 배열 시작 주소 값
결과 : data == *p

#include

void main(){
short int data[2][2];
int *p = data;

printf("data : %x\n", data);
printf("*p : %x\n", *p);
}
data : 배열 시작 주소 값
*p : ?
결과 : data ≠ *p

왜 이런 건가요?

Anti-Lock의 이미지

#include <stdio.h>
 
void main1(){
char data[2][2];
char (*p)[2] = data;
 
printf("data : %x\n", data);
printf("*p : %x\n", *p);
}
 
void main2(){
short int data[2][2];
int *p = data;
 
printf("data : %x\n", data);
printf("p : %x\n", p);
}
 
int main(){
	main1();
	main2();
 
	return 0;
}

http://ideone.com/HovwVT

tyhan의 이미지

답을 달면...
질문을 그대로 남겨주실 것인가요?

https://kldp.org/user/83358/track

Anti-Lock의 이미지

그렇군요.
글 내용을 지워버리는것은 답글 달아준사람들에 대한 예의가 아니네요.

sev314의 이미지

(char(*)[2])p: char 배열(size=2) 포인터 (주소)
*(char(*)[2])p: char 배열(size=2) (주소)
(int*)p: int 포인터 (주소)
*(int*)p: int 포인터 (값)

short int data[2][2] = { 0x1122, 0x3344, 0x5566, 0x7788 };
void *p = data;
int *p2 = NULL;
int i;
 
/* data는 주소이므로 %x 대신 %p를 씁니다. */
printf("data : %p\n", data);
 for (i = 0; i < sizeof(int) / sizeof(short int); i++) {
  p2 = ((int*)p + i);
  /* p2는 주소이므로 %x 대신 %p를 씁니다. */
  printf(" p2 : %p\n", p2);
  printf("*p2 : %x\n", *p2);
}

※ (char(*)[2])p는 '포인터 배열'이 아니라 '배열 포인터'랍니다.