- 교환 법칙 -
#include <stdio.h> // 이런 문법을 허용 한다만 알면 된다. 누가 이런식으로 코딩했을 시 알아 봐야 하기 때문에 알려준다.
int main(void)
{
int A[5] = {1, 2, 3, 4, 5}; //1차원 배열 선언 후 초기화
printf("[%d]\n",A[2]); //그렇다면 배열에서의 교환법칙 이란? 배열에서의 교환법칙. 즉, 누가 이런식으로 코딩하면 맞긴 맞는 코딩.
printf("[%d]\n",2[A]);
return 0;
}
/*
교환법칙
A + B = B + A
A * B = B * A
*/
- 2차원 배열 추가 설명 -
#include <stdio.h>
int main(void)
{
int A[3][4] =
{
{},
{},
{}
};
return 0;
}
/*
A[1] + 2 란 즉, &A[1][2] 와 같다. 또한 저것을 좀더 풀어쓰면 *(A+2) + 2 도 또한 &A[1][2] 와 같다.
&A[1][2]
A[1] + 2
*(A+2) + 2
여기서 이제 값을 바꾸고 싶으면 *만 전부 시켜주면 값이 될 것임을 안다.
A[1][2]
*(A[1] + 2)
*(*(A+2) + 2)
*/
- 2차원 배열 예제 -
#include <stdio.h>
int main(void)
{
int i, j;
/*2차원 배열 초기화의 예 1*/
int arr1[3][3] =
{
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
/*2차원 배열 초기화의 예 2*/
int arr2[3][3] =
{
{ 1 },
{ 4, 5 },
{ 7, 8, 9 }
};
/*2차원 배열 초기화의 예 3*/
int arr3[3][3] = { 1, 2, 3, 4, 5, 6, 7 };
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; ++j)
{
printf("%d ", arr1[i][j]);
}
printf("\n");
}
printf("\n");
for (i = 0; i<3; i++)
{
for (j = 0; j < 3; ++j)
{
printf("%d ", arr2[i][j]);
}
printf("\n");
}
printf("\n");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; ++j)
{
printf("%d ", arr3[i][j]);
}
printf("\n");
}
return 0;
}
- 3차원 배열 -
#include <stdio.h>
int main(void)
{
int mean = 0, i, j;
int record[3][3][2] =
{
{
{70, 80},
{94, 90},
{70, 85}
},
{
{83, 90},
{95, 60},
{90, 82}
},
{
{98, 89},
{99, 94},
{91, 87}
}
};
for(i = 0; i < 3; ++i)
{
for(j = 0; j < 2; ++j)
{
mean += record[0][i][j];
}
}
printf("A 학급 전체 평균 : %g\n", (double)mean/6);
mean = 0;
for(i = 0; i < 3; ++i)
{
for(j = 0; j < 2; ++j)
{
mean += record[1][i][j];
}
}
printf("B 학급 전체 평균 : %g\n", (double)mean/6);
mean = 0;
for(i = 0; i < 3; ++i)
{
for(j = 0; j < 2; ++j)
{
mean += record[2][i][j];
}
}
printf("C 학급 전체 평균 : %g\n", (double)mean/6);
return 0;
}
/*
개념상으로 보면 배열은
[] 1차원 배열 줄 을 의미.
[][] 2차원 배열 판 을 의미
[][][] 3차원 배열 개 를 의미
즉, 개념상으로 따지면 [][] 2차원 배열에서의 왼쪽 대괄호는 1차원 배열이 몇개 있느냐.
[][][] 3차원 배열에서는 맨 왼쪽 대괄호가 2차원 배열이 몇개 있느냐가 되는 것 이다.
이 예제로 입사 문제를 냈을 경우 변수하나 선언하여 3중 for문으로 표현해봐라.
*/
- 더블 포인터의 이해 -
#include <stdio.h>
int main(void)
{
int A = 3;
int* p = &A;
int** pp = &p; //p의 주소를 가진다. 그냥 p를 적게되면 p는 A의 주소값을 가지기에 A주소가 들어간다.
int*** ppp = &pp;
printf("%08X\n",&A);
printf("%08X\n",&p);
printf("%08X\n\n",&pp);
printf("%08X\n",A); //3을 16진수로 표현
printf("%08X\n",p); //p는 A의 주소를 가지니까 A주소 값이 출력
printf("%08X\n\n",pp); //pp는 p의 주소를 가지니까 p주소 값이 출력
//printf("%08X\n",A); //얘는 값과 주소 만 할 수 있고
printf("%08X\n",*p); //p와 pp는 *을 붙일 수 있다.
printf("%08X\n\n",*pp); //p의 주소 값 ( A 의 주소값 )
//printf("%08X\n",A);
//printf("%08X\n",*p);
printf("%08X\n\n",**pp); //★1008 1004 1000 이라고 주소값을 임의로 뒀다고 한다면.. 그림으로 그려볼 것.
//printf("%08X\n",A); //얘는 값과 주소 만 할 수 있고
//printf("%08X\n",*p); //p와 pp는 *을 붙일 수 있다.
//printf("%08X\n",**pp);
printf("%08X\n",***ppp);
return 0;
}
/*
포인터와 배열은 그림으로 표현할 줄 알아야 한다.
무조건 한번씩 그려볼 것.
*/
- 더블 포인터 예제 -
#include <stdio.h>
int main (void)
{
double num = 3.14;
double *ptr = #
double **dptr = &ptr;
double *ptr2; //위험 ! 누구를 가르키는 지 모른다. 그러므로 = 0 으로 NULL 로 초기화를 하는 습관 들일 것.
printf("%9p %9p\n", ptr, *dptr);
printf("%9g %9g\n", num, **dptr);
ptr2 = *dptr; //ptr2 = ptr 과 같은 문장.
*ptr2 = 10.99;
printf("%9g %9g\n", num, **dptr);
return 0;
}
- 더블 포인터 예제 2 -
#include <stdio.h>
void swapintptr(int *p1, int *p2)
{
int *temp = p1;
p1 = p2;
p2 = temp;
}
int main(void)
{
int num1 = 10, num2 = 20;
int *ptr1, *ptr2;
ptr1 = &num1, ptr2 = &num2;
printf("*ptr1, *ptr2 : %d %d\n", *ptr1, *ptr2);
swapintptr(ptr1, ptr2);
printf("*ptr1, *ptr2 : %d %d\n", *ptr1, *ptr2);
return 0;
}
'개발자 > C 언어' 카테고리의 다른 글
C언어_(상수,변수)포인터의 이해 (0) | 2015.04.17 |
---|---|
C언어_다차원 배열 (0) | 2015.04.17 |
C언어_구조체 메모리 최적화(전처리어 pragma 사용법),구조체 활용, 공용체 사용법 (0) | 2015.04.17 |
C언어_구조체의 활용(배열 통째로 옮기기, 구조체 메모리 저장 형태) (0) | 2015.04.17 |
C언어_펌웨어_인터럽트 사용법 (0) | 2015.04.17 |