728x90
300x250

[C언어] 포인터 배열 정리

[소스]

#include <stdio.h>

#define print(imsi) printf(#imsi "\t%08x %d\n", imsi, sizeof(imsi))

main()
{

 int imsi_1[2] = { 5, 7 };
 int imsi_2[3] = { 45, 67, 25 };
 int imsi_3[4] = { 27, 34, 87, 25 };

 int *temp[3];

 temp[0] = imsi_1;
 temp[1] = imsi_2;
 temp[2] = imsi_3;


 print(temp);
 print(&temp);
 print(*temp);
 print(temp[0]);
 print(&temp[0]);

}


결과 :

temp    0012ff1c 12
&temp   0012ff1c 4
*temp   0012ff5c 4
temp[0] 0012ff5c 4
&temp[0]        0012ff1c 4


[설명]

1. temp
Temp는 포인터 변수들의 모임인 포인터 배열의 모 배열입니다. 대상체는 temp 배열 전체이므로 12가 출력됩니다.
2. &temp
temp가 저장된 곳의 주소를 출력하라는 뜻으로 사용했지만 temp는 배열명으로써 메모리 할당을 받지 않기 때문에 temp와 같은 값을 출력하게 되지요. 의미상으로는 맞지 않지만 ANSI에서 새로 추가하여 에러는 발생하지 않습니다... 또한 주소 값에 대한 sizeof()이므로 당연히 4가 출력됩니다.
3. *temp
temp가 가리키는 것은 temp[0]입니다. temp는 temp[0], temp[1], temp[2] 전체를 대상으로 하기 때문에 12가 출력되었지만 *temp가 가리키는 대상체는 temp[0]이며 이것이 할당된 메모리 영역은 4바이트이므로 4가 출력됩니다.

Tip) temp 자체에 대한 대상체를 * 연산자를 이용하여 출력하려면 다음과 같이 하면 되겠습니다.

물론 2차원 배열에 대한 주소 값을 받은 상태라면 이것은 행 전체에 대한 크기를 출력해 줄 것입니다.

printf("%d\n", sizeof(*&temp));

4. temp[0]
temp[0]은 포인터 변수이다. temp[0]을 위해서 할당된 메모리 영역은 4바이트이므로 4가 출력됩니다.

5. &temp[0]
temp[0]에 &연산자를 사용하여 메모리를 출력하고 있습니다. 이 메모리에 대한 메모리 할당은 당연히 4바이트이므로 4가 출력되겠습니다.
반응형
728x90
300x250

[C언어] 꼭 알아야 할 배열 포인터

태스트 : Visual Studio 2008.

#include <stdio.h>

main()
{

 int i, j;

 int imsi[3][2] = {{6, 3}, {9, 1}, {7, 2}};

 int (*imsip)[2];

 imsip = imsi;

 for(i = 0; i < 3; i++)
  for(j = 0; j < 2; j++)
   printf("[ %d][ %d] %d\n", i, j, *(*(imsip + i) + j));

 printf("################################################\n");

 for(i = 0; i < 3; i++)
  for(j = 0; j < 2; j++)
   printf("[ %d][ %d] %d\n", i, j, *(imsip[i] + j));

 printf("################################################\n");

 for(i = 0; i < 3; i++)
  for(j = 0; j < 2; j++)
   printf("[ %d][ %d] %d\n", i, j, imsi[i][j]);

 printf("################################################\n");

 for(i = 0; i < 3; i++)
  for(j = 0; j < 2; j++)
   printf("[ %d][ %d] %d\n", i, j, imsip[i][j]);

}


출력

[ 0][ 0] 6
[ 0][ 1] 3
[ 1][ 0] 9
[ 1][ 1] 1
[ 2][ 0] 7
[ 2][ 1] 2
################################################
[ 0][ 0] 6
[ 0][ 1] 3
[ 1][ 0] 9
[ 1][ 1] 1
[ 2][ 0] 7
[ 2][ 1] 2
################################################
[ 0][ 0] 6
[ 0][ 1] 3
[ 1][ 0] 9
[ 1][ 1] 1
[ 2][ 0] 7
[ 2][ 1] 2
################################################
[ 0][ 0] 6
[ 0][ 1] 3
[ 1][ 0] 9
[ 1][ 1] 1
[ 2][ 0] 7
[ 2][ 1] 2


2. 2차원 배열 포인터 변수에 주소 할당

#include <stdio.h>

main()
{

 int imsi[3];

 int *imsip;


 imsip = imsi;


 printf("%d\n", sizeof(imsi));
 printf("%d\n", sizeof(imsip));
 printf("%d\n", sizeof(*imsip));

}


결과

12
4
4

설명 :
imsi[0] + imsi[1] + imsi[2] 이므로 4 + 4 + 4 = 12Byte
imsip, *imsip 는 포인터 변수이므로 무조건 4Byte로 할당됩니다.
반응형
728x90
300x250
[C언어] 포인터 변수 관계

태스트 환경 : Visual Studio 2008.

#include <stdio.h>

main()
{

/* 변수 선언 */

 int imsi;
 int *imsip;

/* 1. 주소 */

 printf("[1. Address]\n");
 printf("IMSI : %#010x\n", imsi);
 printf("*IMSIP : %#010x\n", imsip);

 imsip = &imsi;

/* 2. 주소 */

 printf("[2. Address]\n");
 printf("IMSI : %#010x\n", imsi);
 printf("*IMSIP : %#010x\n", imsip);

 *imsip = 1024;

/* 3. 주소 */

 printf("[3. Address]\n");
 printf("IMSI : %#010x\n", imsi);
 printf("*IMSIP : %#010x\n", imsip);
 printf("Result : %d\n", *imsip);

}

출력 결과 :

[1. Address]
IMSI : 0xcccccccc
*IMSIP : 0xcccccccc
[2. Address]
IMSI : 0xcccccccc
*IMSIP : 0x0012ff60
[3. Address]
IMSI : 0x00000400
*IMSIP : 0x0012ff60
Result : 1024

반응형
728x90
300x250
[C언어] 포인터 변수에 번지 할당


태스트 : Visual Studio 2008

#include <Stdio.h>

main()
{

 int imsi;
 int *imsip;

 printf("[1. Address]\n");
 printf("IMSI : %#010x\n", &imsi);
 printf("*IMSIP : %#010x\n", imsip);

 imsip = &imsi;

 printf("[2. Address]\n");
 printf("IMSI : %#010x\n", &imsi);
 printf("*IMSIP : %#010x\n", imsip);

}

결과 :

[1. Address]
IMSI : 0x0012ff60
*IMSIP : 0xcccccccc
[2. Address]
IMSI : 0x0012ff60
*IMSIP : 0x0012ff60

반응형
728x90
300x250

[C언어] 포인터를 이용한 다중 배열 요소의 출력 - 2 -

이번에는 포인터를 이용한 다중 배열 요소의 출력을 해보도록 하겠습니다.
*(a+0) 형식을 응용한 형태의 꼴로 구현 할 수 있습니다.

a[2][2][2] 의 경우 배열로 어떻게 표현하나요?

int a[2][2][2] = {{{3,3},{3,3},{3,3}},{{a,b},{b,c},{c,a}},}

이런 형태로 구현이 가능하겠죠.

a[1][2] = {{2,2},{3,3}}

이런 다차항의 배열 또한 역시나 수식으로 표현하실 수가 있습니다.

a[i][j]

*(*(a + i) + j)

단, a는 포인터로 연결된 배열 변수

이처럼 다중 포인터 역시나 쉽게 구현이 가능하겠습니다.
아래의 소스코드를 가지고 연습해보시기 바랍니다.

#include <stdio.h>

int main()
{
 
 int a[2][3][2] = {{{10,20},{20,30},{30,40}},{{60,70},{70,80},{90,30}}};
 
 int b[2][3] = {{10,20,30},{20,30,40},};

 int c[5] = {10,20};

 int * nk;

 nk = c;

 /* 주의 : 포인터 변수로 선언 후에 배열 포인터로 지정하여 계산한다.*/

 printf("%d", *(*(*(a+1) + 2) + 0));

}

반응형
728x90
300x250

[C언어] 포인터를 이용한 배열 요소의 출력 - 1 -

배열의 경우에는 포인터와 가장 밀접한 관계(Relation)을 성립하고 있습니다.
결국 이 말은 배열을 포인터로 사용할 수 있다는 뜻이기도 하지요.

이론적인 부분들에 대해서는 별도로 교제를 사서 공부하시면 되겠습니다.
그래도 혹시나 하는 마음에 조금 설명을 하고자 합니다.


 p == a == &a[0], p+n == &a[n]
 *p == a[0],
 *(p+n) == a[n]
 p2 = &a[3] == p+3,
 p2+1 == &a[4] == p+4,
 p2+2 == &a[5] == p+5
 *p2 == a[3] == *(p+3)
 




1. 배열 요소로 쉽게 출력하는 방법

Example : a[3]의 값을 포인터 수식으로 표현한다고 가정하고, 다음의 절차를 따르도록 합니다.

[단계 1] : 배열 기호[]를 생략하고, 배열명 a앞으로 빼내면서 *로 바꿉니다.

*a3

[단계 2] : * 뒤에 남은 요소를 (배열명+첨자) 형태로 바꿉니다.

*(a+3)

이게 전부입니다. 참 쉽죠??

#include <Stdio.h>

int main()
{

 int a[5] = {100, 200, 300, 400, 500};

 int *nk;

 nk = a;

 printf("%d", *(nk));

}

반응형
728x90
300x250

[C언어]  포인터 연산

포인터 연산을 편하게 이해하실 수 있는 예제입니다.

#include <stdio.h>

int main()
{

 char *pc, c = 'A';
 int *pi, i = 129;

 /* 포인터 연결 */

 pc = &c;

 pi = &i;
 
 printf("1번 결과------------------\n");

 printf("&C포인터 주소 = %X, *pc포인터 주소 = %X, C 내용 = %d, *PC 내용 = %5c\n", &c, pc, c, *pc);
 printf("&i포인터 주소 = %X, *pi포인터 주소 = %X, i 내용 = %d, *Pi 내용 = %5d\n", &i, pi, i, *pi);

 /* 1번 예제 포인터 값 증가 */
 
 (*pi)++;

 printf("*pi값 증가 : %d, i값 증가 = %d\n", *pi, i);

 /* 2번 예제 포인터 주소 변경 */

 *pc++;

 printf("*pc포인터 주소 변경 : %X, 데이터값 = %d\n", &pc, *pc);

}

 

반응형
728x90
300x250

[C언어] 포인터에 익숙해지는 방법은...

자료형 *변수명1;
자료형 변수명2;

변수명1 = &변수명2;
 

이 정도 형식까지는 쉽게 이해하시는데 더 나아가라고 하면 머리에 한계를 느끼는 부분이 없지않다고 봅니다.

포인터의 경우에는 메모리를 제어해야하는 부분이기에 익숙해지기가 쉽지 않습니다.
물론 포인터에 익숙해지고 싶다면, "백문이불여일타"를 하는 방법도 좋긴하지만 메모리 맵을 직접 작성해보는 것이 좋은 방법이 아닐까 생각합니다.

지금 포인터가 이해가 가지 않으시다면, 임의 그림으로 주소범위를 그려서 낙서장에 적어보도록 하세요...

당장....

반응형

+ Recent posts