2차원 포인터변수 쓰는법...내공20

2차원 포인터변수 쓰는법...내공20

작성일 2004.02.03댓글 3건
    게시물 수정 , 삭제는 로그인 필요

다음과 같이 2차원포인터 변수가 초기화 되어 있을 때 다음은 뭘 나타내나여?

int imsi[3][2]={{6,2},{4,5},{3,8}};
int (* imsip)[2];
imsip = imsi

일 때

-imsi는 주소이면서 가리키는 것은 배열 자체인가여?
-이것들은 위 프로그램에서 뭘 나타내나여? 주소와 값으로 분류해 주고 대상체의 수도 갈켜주세요. 틀린 것 있다면 지적해주고요.
1.*imsip
2.*imsi
3.*imsip+1
4.*imsi +1
5.imsi + 1
6.imsip +1
7.*(imsip+1)
8.*(imsi+1)
9.*(*(imsip+1)+1)
10.*(*(imsi+1)+1)
11.(*imsip+1)
12.(*imsi+1)
13.imsip
14.imsi



profile_image 익명 작성일 -

imsi는 6을 가르키는 포인터(주소) 입니다. 그리고 배열 자체 입니다.

imsi 주소가 100이라고 했을때

1.*imsip = 100 (주소)
2.*imsi = 100 (주소)
3.*imsip+1 = 104 (주소)
4.*imsi +1 = 104 (주소)
5.imsi + 1 = 108 (주소)
6.imsip +1 = 108 (주소)
7.*(imsip+1) = 108 (주소)
8.*(imsi+1) = 108 (주소)
9.*(*(imsip+1)+1) = 5 (값)
10.*(*(imsi+1)+1) = 5 (값)
11.(*imsip+1) = 104
12.(*imsi+1) =104
13.imsip = 100
14.imsi = 100

 

--------------------------------------------------------------------------

int imsi[3][2]={6,2,4,5,3,8};

  ---------

  |  6  |  2  |

  ---------

  |  4  |  5  |

  ---------

  |  3  |  8  |

  ---------

 

만약 6값을 가지고 있는 메모리 공간을 가르키는 주소가 100이라면(가정을 하는겁니다.)

*imsi+0(또는 *imsi)이 가르키는 주소가 100이겠죠? (imsi+0(또는 imsi)이 가르키는 주소는 도100)

*imsi+1은 104

*imsi+2는 108 (imsi+1은 108)

*imsi+3는 112

*imsi+4는 116 (imsi+2는 116)

*imsi+5는 120

 

*(*imsi) = 6

*(*imsi+1) = 2

*(*imsi+2) = 4

*(*imsi+3) = 5

*(*imsi+4) = 3

*(*imsi+5) = 8

 

**(imsi) = 6

**(imsi+1) = 4

**(imsi+2) = 3

---------------------------------------------------------------------

 

또다른 예) int imsi[2][3]={6,2,4,5,3,8};


 

  --------------

  |  6  |  2  |  4  |

  --------------

  |  5  |  3  |  8  |

  --------------

 

*(*imsi) = 6

*(*imsi+1) = 2

*(*imsi+2) = 4

*(*imsi+3) = 5

*(*imsi+4) = 3

*(*imsi+5) = 8

 

**(imsi) = 6

**(imsi+1) = 5

 

덤으로 imsi하고 imsi+0하고 다른건 아시나요?

아까 말씀하신대로 imsi는 배열 자체이지만 imsi+0은 배열 자체(배열 전체)를 가르키지 않습니다.

사이즈를 보면 sizeof(imsi) = 24이지만 (4*6 =24)

sizeof(imsi+0) = 4 입니다.(4*1=4)

----------------------------------------------------------------------------

 


 

profile_image 익명 작성일 -

int imsi[3][2]={{6,2},{4,5},{3,8}};
int (* imsip)[2];
imsip = imsi
-imsi는 주소이면서 가리키는 것은 배열 자체인가여?
내 맞습니다. 2차원배열 그자체 입니다.

-이것들은 위 프로그램에서 뭘 나타내나여? 주소와 값으로 분류해 주고 대상체의 수도 갈켜주세요. 틀린 것 있다면 지적해주고요.
일단은 선언문 int (* imsip)[2];의 의미부터 생각해 보면 쉽게 알수 있을겁니다.
이 의미는 2개의 배열을 같는 정수형 포인터 변수를 생성시킨다는 의미 입니다.
즉, imsip = imsi 이 문장이 오류가 없으려면 imsi의 배열크기는 imsip[N][2]이어야
한다는 겁니다.그렇지 않으면 오류 처리 됩니다.

1.*imsip
포인터 imsip가 가지고있는값. 즉, imsip[0]의 값. 이값은 imsi[0]의 주소와 같다.

2.*imsi
위와 마찬가지.

3.*imsip+1
imsip[0]의 다음값. imsip[1]의 값으로 imsi[1]을 가르키게 된다.

4.*imsi +1
위와 마찬가지

5.imsi + 1
이것은 컴파일시엔 오류가 없겠지만 실행 도중 오류가 날소지가 있다.
imsi배열의 그다음 주소 즉 imsi로부터 24바이트 떨어진곳을 가르킨다.
(int는 4바이트라 가정)

6.imsip +1
위와 마찬가지

7.*(imsip+1)
결과는 6항과 같다. 주소의 덧셈연산이 있다는걸 빼면 원리는 3과 같다.

8.*(imsi+1)
위와 마찬가지

9.*(*(imsip+1)+1)
imsi로 부터 24바이트 떨어진곳((imsip+1))에서 두번째 배열(*(imsip+1)+1)의
첫번째 값을 나타낸다.
이것의 이해를 돕자면 *(*(imsip)+1)라고 할때 최종 가르키는 값은 4가 된다

10.*(*(imsi+1)+1)
위와 마찬가지

11.(*imsip+1)
imsip[1]과 같다.(*imsip+1과 *imsi+1은 같다.)

12.(*imsi+1)
위와 같다

13.imsip
2차원배열을 가르기위한 배열명.여기선 imsi가 된다.

14.imsi
2차원배열 그자체.

imsi와 imsip와의 가장큰 차이는
imsi는 2차원 배열 그자체이며 imsip는 갯수가 2개인 2차원 배열 또는 포인터를
가르키기 위한 포인터라는것.
-----------------------------------------------------------
| imsi (24byte) | unknow area |.... | imsip(4byte) |
-----------------------------------------------------------
위와 같은 구조로 되어있다.
imsi를 세분화 하면

imsi(#으로 둘러 싼 부분)
imsip는 imsi를 지시한다. +로 시작되는곳이 imsi+1(imsip+1)
##############################++++++++++++++++++++
# #+imsi[0](@으로 둘러싼부분)=*imsi
# @@@@@@@@@^^^^^^^^^---------#+
# @ 6 | 2 @^ 4 | 5 ^| 3 | 8 |#+
# @@@@@@@@@^^^^^^^^^---------#+ ^로 표시된곳은 *imsip+1 = imsi[1]
# #+ (*(*imsi+1)= *imsi[1]=4,*(*imsi+2)= *imsi[2]=3)
##############################++++++++++++++++++++++++
imsi는 모두 imsip로 바꾸어 사용가능.
웹에디터를 쓸줄몰라서...
에공 지저분해라.

profile_image 익명 작성일 -

-imsi는 주소이면서 가리키는 것은 배열 자체인가여?

int imsi[3][2]={{6,2},{4,5},{3,8}}; 이러한 2차원 배열은 2중 포인터와 비슷한 구조를

가집니다. 그림으로 잠시 그려보면 이렇죠..

 

imsi(주소) --> imsi[0](주소) --> imsi[0][0]  6
imsi[0][1]  2
imsi[1] --> imsi[1][0]  4
imsi[1][1]  5
imsi[2] --> imsi[2][0]  3
imsi[2][1]  8

 

이렇게 논리적으로 이렇게 이루어지죠..

즉, 이중 포인터의 구조를 가집니다.

따라서, imsi는 배열의 첫번째 요소의 주소값을 가리키죠..

즉,  imsi == &imsi[0] == &imsi[0][0] 가 모두 같은 값을 가리킵니다.

따라서, 다음과 같이 하면 결과를 정확히 파악하실 것입니다.

 printf("%p %p %p\n", imsi, &imsi[0], &imsi[0][0]);

 

본론으로 들어가서, 변수 imsi는 주소값을 가지는데, 그것은

배열의 첫번째 요소를 가리키는 주소값을 가지고 있다. 로 생각하시면 됩니다.

 

이런 배경지식을 토대로 몇가지 간단한 문제를 파악해보죠.

**imsi == *imsi[0] == imsi[0][0] 의 값은 6으로 같습니다.

printf("%d %d %d\n", **imsi, *imsi[0],  imsi[0][0]);

이런 원리로 해서.

 printf("%d %d %d\n", **(imsi+1), *imsi[1], imsi[1][0]);
 printf("%d %d %d\n", **(imsi+2), *imsi[2], imsi[2][0]);

도 같은 결과를 이끌어 냅니다.

 

 

1.*imsip   배열의 첫번째 요소(imsi[0][0])를 가리키는 주소값
2.*imsi     배열의 첫번째 요소를 가리키는 주소값
3.*imsip+1 배열의 첫번째 요소를 가리키는 주소값에 1을 증가 시킨 값
4.*imsi +1 배열의 첫번째 요소를 가리키는 주소값에 1을 증가 시킨 값
5.imsi + 1  배열의 첫번째 요소를 가리키는 주소값에 1을 증가 시킨 값
6.imsip +1 배열의 첫번째 요소를 가리키는 주소값에 1을 증가 시킨 값
7.*(imsip+1)  배열의 두번째 요소(imsi[1][0])를 가리키는 주소값, 즉, &imsi[1][0]과 같은 값
8.*(imsi+1)  배열의 두번째 요소를 가리키는 주소값, 즉, &imsi[1][0]과 같은 값
9.*(*(imsip+1)+1)  배열의 두번째 요소의 두번째 값(imsi[1][1]), 여기서는 5를 가리킨다.
10.*(*(imsi+1)+1) 배열의 두번째 요소의 두번째 값(imsi[1][1]), 여기서는 5를 가리킨다.
11.(*imsip+1) 앞의 4번과 같음
12.(*imsi+1)  앞의 5번과 같음
13.imsip  배열의 첫번째 요소의 주소값
14.imsi 배열의 첫번째 요소의 주소값

이상입니다. 여기서 하나도 잘못된 것은 없습니다.

어차피 사용하기 나름이니까요..

2차원 포인터변수 쓰는법...내공20

다음과 같이 2차원포인터 변수가 초기화 되어 있을 때 다음은 뭘 나타내나여? int imsi[3][2]={{6,2},{4,5},{3,8}}; int (* imsip)[2]; imsip = imsi 일 때 -imsi는...

2차원 포인터 변수2차원 배열의...

... , 예를 들어서 imsi=imsip, **imsi=**imsip, *imsi+1=*imsip+1 등등 2차원 포인터변수2차원배열명으로 써도 어떤 상황에서도 포인터변수(imsip) 쓰는거나 배열명(imsi)...

포인터변수2차원 배열에 관한질문

... 질문을 너무 많이하다보니깐 내공이 별로없네요.... 2차원 배열이라고 생각하고 쓰는 것은 그저 [1차원... 따라서 int타입을 가리키는 포인터변수2차원 배열의...

C++ 포인터변수 사용한 성적 관리...

... 30, 20, 10, 90, 100, 60 2. 수학 성적 가장 높은 학생 - 포인터 변수를 이용한 배열 참조 (배열은 선언만... 30, 20, 10, 90, 100, 60 }; //편의를 위해 2차원 배열로 선언...

c언어 1차원변수포인터변수..

1차원 변수포인터변수에 대하여.. int a[]={10, 20, 30... 이거랑...그리구 2차원 배열변수포인터... 이거 좀 답해주세요..ㅠㅠ 내공 걸겟습니당 일단 풀고...

2차원 배열 질문[내공200]

... b라는 포인터 배열 변수를 선언하고, a[0]과 a[1]을 넣어줬습니다. a[0]과 a[1]은 2차원 배열의 첫 번째... 16 20 만약 a[0][0]의 주소값이 0이라 할 때 각 변수들의...

C언어 포인터 질문이요(내공)

... 위해서는 포인터 변수를 사용할 것 포인터... 값 ⊙ 2차원 배열을 선언하여 1행에는 값을... ㅠ 다 풀어주시면 감사내공 더 갑니다... 푸실수...