프로그래밍

 3198, 1/160 회원가입  로그인  
   테라바이스
   C책을 보다 이해않되는 부분-(포인터 *)-이에요 답좀 부탁드릴께요

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=2868 [복사]


우선 아래 포인터에 관한 내용 중에는
아는 부분이 있지만 특히 모르는 부분이 있네요.
아직 초보라서 그렇지만 잘 모르니
조금은 자세하게 풀어서 설명해 주실분
답좀 달아주시면 고맙겠습니다^-^  XD

0)int doard[x][z];
1)int **ptr;
2)int *risks[x];
3)int (*rusks)[x];
4)int *oof[x][z];
5)int (*uuf)[x][z];
6)int (*uof[x])[z];

0)번은 알겠고, 1)도 포인터의 포인터인것은 알겠습니다.
2)의 경우부터 애매한대요 int형을 가리키는 포인터 x개 배열인가요?
3)이게 뭔지를 모르겠네요;
4)이야 2번이랑 같은 개념으로 지금은 생각중이구요-맞은건지는..
5)와 6)은 무슨 차이인 걸까요? 3)이 이해가 가야 될것같은 느낌이라서요.
답변 부탁드릴께요

  Hit : 4221     Date : 2011/01/23 09:24



    
geniousblue 2번은 연산자 우선 순위를 보시면 알겠지만
[] 의 우선순위가 *(포인터)의 우선순위보다 높습니다.
따라서 int *(risks[x]); 로 번역이 되구요. 이것은 예상하신듯이 int형을 가리키는 포인터 x개 배열이 맞습니다.
3번의 경우에는 포인터의 크기를 정해주는 것입니다.
예를 들어 int* risks; 라는 변수가 있고, 이 값이 0x0012FF10 이라고 가정합니다.
risks++를 하게 되면 컴파일러는 risks변수가 4byte 값인 int 형을 가리키고 있기 때문에 4의 주소를 증가시켜 0x0012FF14를 가리키게 합니다. 그런데 int (*risks)[3] 인 경우라면 risks++를 하였을 때에 risks변수가 int 3개를 가진 행렬을 가리키고 있으므로 12byte가 증가하여 0x0012FF1C를 가리키게 됩니다.
4번의 경우는 역시 우선순위에 따라 int형을 가리키는 2차원 배열입니다.
5번은 이차원 배열 크기만큼 증가시킬 수 있도록 선언된 포인터구요. (3번과 비슷합니다)
6번은 우선순위에 따라 z만큼의 int형 변수(즉 4byte * z)를 가리키고 있는 x개의 배열이 선언된 것입니다.
2011/01/24  
$Zero 인덱스([]) 연산자도 포인터 연산자입니다. * 와 같은 연산자라고 보시면 되요 .
다른점이 있다면 인덱스 안에는 정수를 기입할수 있다는거지요 .
이 정수의 역활은 포인터 연산입니다.
주소값을 변경한다는 뜻 .

그럼 [3]이면 포인터의값을 +3만큼 증가시킨뒤 그곳에서 * 연산을 해라 라고 해석하시면됩니다.
즉 배열이 아니어도 포인터라면 [] 연산자를 사용할 수 있습니다.
*와 같은 연산자이면서 부가적인 연산(포인터 이동)을 수행할수 있는 연산자이니까요 .
2011/01/25  
$Zero 위에 *와 []를 같이 사용했다는건 , 더블포인터나 2차원 배열 이겠네요 .
아시죠 ? 2차원 배열도 더블포인터라는것을.
arr[0][0]은 결국 **arr 과 똑같은 것입니다.
2011/01/25  
테라바이스 고맙습니다 ^^ 2011/01/25