노는게 제일 좋습니다.

15회차 : 배열 포인터, 배열과 문자열 본문

C

15회차 : 배열 포인터, 배열과 문자열

노는게 제일 좋습니다. 2017. 2. 26. 18:57

참고 자료 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. 정적데이터 영역의 초기화

일반적으로 정적데이터 영역은 프로그램 실행 파일 내부이므로 값을 쓸 수 없다. 읽기만 가능하다.

Comments