노는게 제일 좋습니다.
15회차 : 배열 포인터, 배열과 문자열 본문
참고 자료 http://soen.kr/
이번에도 이 내용들을 이해하는데 시간이 정말 오래걸렸다.
개념 자체는 별 것 아닌데, 실제로 코드를 써보고 이건 왜 이런지를 고민하는 시간이 많았다.
1. 배열 포인터
int intar[5][3]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
int (*ar)[3];
ar = intar;
여기서 *ar++를 하면 {6,7,8,9,10}을 가리킨다.
만약 int(*ar)[3]에 int a[7]={1,2,3,4,5,6,7} 을 넣고싶다면, 이렇게 캐스팅할 수 있다.
ar = (int(*)[3])a;
2. 배열 인수의 표현
함수가 배열을 인수로 받을 때, *ar로 써도되고, ar[i]로 써도 된다.
사실 배열을 인수로 전달할 수는 없다. 배열의 포인터를 전달한다.
void sum(int ar[3])
{
int a = 0;
for (int i = 0; i < 3; i++)
{
a += ar[i];
}
printf("%d\n",a);
}
int main()
{
int ar[3] = { 1,2,3 };
sum(ar);
}
다음과 같은 코드에서 첫줄은 void sum(int *ar) 와 같이 써도 된다.
int ar[3][2] = { 1,2,3,4,5,6 }; 일 경우는 void sum(int ar[][2]), void sum(int (*ar)[2])로 쓰면 된다.
두 번째 첨자부터만 똑바로 쓰면 된다. 그 앞의 것은 아무숫자나 넣어도 된다.
3. 문자열 상수
printf("hello"); 라는 프로그램을 실행할 때, "hello"는 정적데이터 영역에 문자형 포인터로 기록된다. 맨 뒤에는 널문자가 1바이트를 차지한다. 만약 같은 문자열이 여러번 나오면 한 번만 기록한다.
이후 이걸 가져다가 써서 화면에 hello를 출력한다.
4. 문자형 배열과 문자형 포인터의 차이
char *ch="hello";
의 경우, 정적데이터 영역에 hello를 기록하고 포인터를 값으로 갖는다.
char ch[]="hello";
의 경우 정적데이터 영역에 hello를 기록하는 것 까진 같다. 그러나 이후 그 기록된 내용을 사용해 ch배열을 초기화한다. 즉, 정적데이터 영역에 기록된 문자열을 그대로 가리키는 것이 아니라, 그 내용을 가져다 새로운 배열을 꾸리는 것이다.
5. 정적데이터 영역의 초기화
일반적으로 정적데이터 영역은 프로그램 실행 파일 내부이므로 값을 쓸 수 없다. 읽기만 가능하다.
'C' 카테고리의 다른 글
17회차 : 구조체 정의, 구조체 멤버 참조 (0) | 2017.03.02 |
---|---|
16회차 : 문자열 함수, 수치와 문자열 (0) | 2017.03.01 |
14회차 : 첨자 연산, 포인터 배열 (0) | 2017.02.23 |
13회차 : 동적 메모리 할당, 이중 포인터 (0) | 2017.02.20 |
12회차 : void형 포인터 (0) | 2017.02.18 |