1차원 배열과 포인터의 관계
배열을 포인터처럼 쓸 수 있고 포인터를 또한 배열 처럼 쓸 수 있다.
char a[4] = {'N', 'e', 'o'}; //char a[4] = "Neo";
// 주소값에 대한 표현
&a[n] = a + n
// 주소값의 내용물에 대한 표현
a[n] = *(a + n) = *(&a[n])
|
| a &a[0] | a+1 &a[1] | a+2 &a[2] | a+3 &a[3] |
|
|
|
| 1000 | 1001 | 1002 | 1003 |
|
|
|
| N | e | o | \0 |
|
|
|
| a[0] *(a) | a[1] *(a+1) | a[2] *(a+2) | a[3] *(a+3) |
|
|
예>
#include <stdio.h>
void main()
{
// 배열과 포인터에 대한 관계
char name[10] = "Neo";
char* pname = name;
printf("name: %s pname: %s\n", name, pname);
*(pname) = 'x';
*(pname+1) = 'y';
*(pname+2) = 'z';
printf("name: %s pname: %s\n", name, pname);
*(name) = 'B';
*(name+1) = 'o';
*(name+2) = 'b';
printf("name: %s pname: %s\n", name, pname);
name[0] = 'J';
name[1] = 'o';
name[2] = 'e';
printf("name: %s pname: %s\n", name, pname);
pname[0] = 'M';
pname[1] = 'a';
pname[2] = 'x';
printf("name: %s pname: %s\n", name, pname);
// 결론 : a[n] = *(a + n)
}
2차원 배열과 포인터의 관계
int c[2][3] = { 1, 2, 3, 4, 5, 6};
&c[n] = c + n
c[n] = *(c + n)
&c[n][m] = *(c + n) + m = c[n]+m
c[n][m] = *(*(c + n) + m) = *(c[n]+m)
3000 c &c[0] *(c+0) c[0] &c[0][0] | 3004
*(c+0)+1 c[0]+1 &c[0][1] | 3008
*(c+0)+2 c[0]+2 &c[0][2] | 3012 c+1 &c[1] *(c+1) c[1] &c[1][0] | 3016
*(c+1)+1 c[1]+1 &c[1][1] | 3020
*(c+1)+2 c[1]+2 &c[1][2] |
1 | 2 | 3 | 4 | 5 | 6 |
c[0][0] *c[0] *(*(c+0)+0) | c[0][1] *(c[0]+1) *(*(c+0)+1) | c[0][2] *(c[0]+2) *(*(c+0)+2) | c[1][0] *c[1] *(*(c+1)+0) | c[1][1] *(c[1]+1) *(*(c+1)+1) | c[1][2] *(c[1]+2) *(*(c+1)+2) |
c+1 => c+1*sizeof(int)*3
c[0]+1 => c[0]+1*sizeof(int)
c[i][j] == *(*(c + i) + j)
예제1>
#include <stdio.h>
void main()
{
int c[2][3] = {1, 2, 3, 4, 5, 6};
for (int i = 0; i < 2; ++i)
{
for (int j = 0; j < 3; ++j)
{ // 결론 : a[n] = *(a + n)
printf("%p:%p:%p[%d][%d]=(%d:%d:%d) \n",
&c[i][j], *(c + i) + j, c[i]+j, // 주소값 똑같다.
i, j,
c[i][j], *(*(c + i) + j), *(c[i]+j) ); // 내용물 똑같다.
}
printf("\n");
}
}
포인터 배열(Array of Pointer) : 배열이며, 해당되는 자료형의 포인터를 저장하는 연속된 공간의 집합이다.
#include <stdio.h>
void main()
{
char *a = "123567890";
char *b = "asdf";
char *c = "The Calling";
char *d = "Are you ready to change your life?";
char* p[4] = {a, b, c, d};
for (int i = 0; i < 4; ++i)
printf("p[%d]:%p = %s\n", i, p[i], p[i]);
}
<결과>
p[0]:00406144 = 123567890
p[1]:0040613C = asdf
p[2]:00406130 = The Calling
p[3]:0040610C = Are you ready to change your life?
Press any key to continue
배열 포인터(Pointer to Array) : 포인터이며, 다차원 배열의 전체 시작 주소를 저장한다.
char name[2][3] = {"ab", "xy"};
char (*ppName)[3] = name; // sizeof(char) * 3 단위로 계산된다.
ppName+1 오른쪽과 같이 해석된다. ppName+1*sizeof(char) * 3 == ppName + 3
int school[2][3][4];
int (*pSchool)[3][4] = school; // sizeof(int) * 4 * 3 단위로 계산된다.
예제2>
#include <stdio.h>
void main()
{
char name[2][3] = {{'a','b'}, {'x','y'}};
char (*ppName)[3] = name;
char *pName0 = *(ppName+0); //ppName[0]
char *pName1 = *(ppName+1); //ppName[1]
// ppName[0] == *ppName
// ppName[1] == *(ppName+1)
printf("ppName[0] = %s\n",ppName[0]);
printf("ppName[1] = %s\n",ppName[1]);
printf("ppName = %s\n",*ppName);
printf("ppName+1 = %s\n",*(ppName+1));
printf("pName0 = %s\n",pName0);
printf("pName1 = %s\n",pName1);
// 결과는 똑같지만 ppName != ppName[0]
// 결과는 똑같지만 ppName != *(ppName + 0)
printf("ppName = %s\n",ppName);
printf("ppName+1 = %s\n",ppName+1);
}
함수 Parameter 를 배열로 설정하기
2차원 배열
#include <stdio.h>
//void SetMatrix(float m[][4], float fValue , int iCount)
void SetMatrix(float (*m)[4], float fValue , int iCount)
{
for (int i = 0; i < iCount; ++i)
{
*(*m + i) = fValue;
}
}
void main()
{
float matWorld[4][4]=
{ 1.0f, 2.0f, 3.0f, 4.0f,
5.0f, 6.0f, 7.0f, 8.0f,
9.0f, 10.0f, 11.0f, 12.0f,
13.0f, 14.0f, 15.0f, 16.0f
};
SetMatrix(matWorld, 0.0f, 8);
for (int i = 0; i < 4; ++i)
{
for (int j = 0; j < 4; ++j)
{
printf("%2.1f ", matWorld[i][j]);
}
printf("\n");
}
printf("%d\n", sizeof(matWorld));
}