상세 컨텐츠

본문 제목

c언어 메모, 정리 배열, 포인터-3일차 첫번째

코딩

by Davinc2 2022. 12. 7. 14:00

본문

배열은 []연산자를 사용하여 표현

포인터는 *연산자를 사용하여 표현

 

포인터는 포인터 변수가 가리키는 메모리의 시작 주소를 기준으로 삼음

 

배열도 해당 배열이 사용하는 메모리 그룹의 시작 주소를 기준으로 삼는다.

 

*(data+1) = 5;  == data[1]=5;    둘이 같다

 

 

배열 표기법의 한계

data[2]가 포인터 표기에 비해 좀 더 간단해 보이지만 간단해보인다는 뜻은 표현에 제약이 있다는 뜻이다.

 

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

data라는 1차원 배열 선언

0x78 0x56 0x34 0x12

0x78   0x56  0x34  0x12 0x78 0x56 0x34 0x12

                             data[0]                                                         data[1]

 

위와 같이 선언한 data배열에서 data[0] 요소는 총 4바이트로 구성됨

그런데 첫번째 바이트에 있는 값 0x78을 0x22로 변경하고 싶어서 배열 표기법으로 

data[0]에 0x22를 대입하면 

data[0] = 0x22; 가 된다

data[0]는 4바이트 크기의 메모리를 의미하기 떄문이다.

 

0x22 0x00 0x00 0x00

                                                     data[0]

 

 

배열 표기법 대신 포인터 표기법을 사용

*(data+1) = 0x22;        data[1]=0x22;를 포인터 표기법으로 나타냄

 

이렇게 하고나면 형 변환 연산자 사용가능

*(char*)(data+1) = 0x22;   일시적으로 int형을 char형으로 변환함

포인터가 가르키는 대상의 크기를 4바이트에서 1바이트로 변경된다는 의미

따라서 0x22값을 대입하면 4바이트영역이 아니라 1바이트 영역만 변경

 

0x78   0x56  0x34  0x12 0x22 0x56 0x34 0x12

                             data[0]                                 < char *>                       data[1]

 

포인터 수식을 배열로 간단하게 표기

int tips = 0x123456789,sum;

char *p;                     //int형 변수인 tips에 1바이트씩 접근하기 위해 char *형 포인터를 선언

p = (char *)&tips;      // &tips 는 int*형이기 떄문에 형 변환을 사용해서 char*로 맞춘다.

sum = *(p + 0)+ *(p + 1)+ *(p + 2)+ *(p + 3); //각 바이트별로 값을 합산

 

이렇게하면 *p를 사용하여 tips 변수의 값을 1바이트 단위로 구별하여 사용가능

sum = *(p + 0)+ *(p + 1)+ *(p + 2)+ *(p + 3); == sum p[0] + p[1] + p[2] + p[3];

배열 표기법으로 바꾸면 이렇게 된다.

 

 

배열 시작 주소

 

배열 변수의 이름은 배열의 시작 주소

포인터는 변수의 주소뿐 아니라 배열같이 그룹으로 묶인 메모리주소도 가질 수 있다.

char data[4];

char *p = &data[0]; //배열 첫번쨰 항목 주소가 배열 전체의 시작 주소와 같다.

 

char *p = &data[0]; -> 배열 표기법으로 변경

                0을 생략하면

               & * data;   & * 서로 반대 개념,서로 상쇄

char *p = data;

 

 

 

#define ADDR    100

 

int data = ADDR  // int data = 100; 이다.

 

ADDR = ADDR + 1; //대입 불가 100 = 100 + 1; 과 같은 표현

char data[5];

data = data + 1; //오류 배열은 자신에게 배정된 주소를 변경불가

 

 

여기까지하고 2로 넘어가서 하겠습니당. 

 

 

 

관련글 더보기