티스토리 뷰

C언어

C언어 배열과 포인터

블로그 강승 2021. 3. 15. 18:09

C언어 배열과 포인터

C언어 배열과 포인터에 대해 Do it! C언어 입문(저자:김성엽) 이란 책을 통해 공부했으며, 책의 카테고리를 바탕으로 필자가 이해한 내용을 요약한 글이다. 내용이 궁금하거나 찾아야 할 내용이 있으면, 필자가 정리한 글을 다시 보면서 복습하기위해 작성했다. 바로 아래에서 글을 확인하도록 하자.

 

배열 표기법과 포인터 표기법의 관계

배열은 배열이 사용하는 메모리 그룹의 시작 주소를 기준으로 하고, 포인터도 포인터 변수가 가리키는 메모리의 시작 주소를 기준으로 주소를 갖고 있음.

char data[5]

data[1]=5;
*(data+1)=5; /* 3행과 4행의 식은 같음 */
char data;
char *p = &data;
*p = 3;
p[0]=3; /*3행과 4행의 식은 같음 */

 

배열 표기법의 한계

int data[2] = {0x12345678,0x12345678};

이렇게 선언하고 data[0]의 78 부분만 바꾸고 싶어서 data[0] = 0x22를 넣으면 data[0] = 00000022 이 된다.
하지만 포인터 표기법을 사용하면 가능하다.

*(char *)data=0x22; /* 값이 0x12345622 됨. */

 

배열 시작 주소

char data[4];
char *p = &data[0]; /* 같은 표현이다 */
char *p = data;

 

배열 예제를 포인터 사용해서 바꾸기

#include <stdio.h>
void main()
{
char data[5]={1,2,3,4,5};
int result = 0,i;
char *p= data;

for(i=0;i<5;i++){
result = result + *p;
p++; /* 포인터 변수 p가 가리키는 곳의 크기는 1byte 이므로 p++ 를 하면 다음 1바이트인, data[1]을 가리킴*/
}

printf("data 배열의 각 요소의 합은 %d 입니다.\n", result);
}
/*결과화면 data 배열의 각 요소의 합은 15입니다. */

 

배열과 포인터의 합체

char *p1, *p2, *p3, *p4, *p5;
/* 이렇게하면 많은 포인터 변수를 선언할때는 힘듦.
아래처럼 선언할 수 있음 */

char *p[5];

 

포인터를 기준으로 배열과 합체하기

char(*p)[5];
/* 이건 포인터변수 p 1개가있는거고,
p가 가리키는 대상이 5바이트 라는 뜻이다.
(*p)[1] 이것은 p가 가리키는 5바이트중에
2번째 1바이트를 가리키는 뜻이다. */

p++;
/* p가 가리키는 대상이 5바이트 이므로 5바이트씩 주소가 증가한다.
예를들어 p가 100번지를 가리키면 p++ 이후는 105번지를 가리키게 된다. */

 

글을 마음대로 배포하셔도 되지만, 출처(링크)는 반드시 남겨주시기 바랍니다.

'C언어' 카테고리의 다른 글

C언어 동적 메모리 할당  (0) 2021.03.15
C언어 정적 메모리할당  (0) 2021.03.15
C언어 표준 입력 함수  (0) 2021.03.15
C언어 포인터  (0) 2021.03.14
C언어 배열  (0) 2021.03.12
댓글