배열은 []연산자를 사용하여 표현
포인터는 *연산자를 사용하여 표현
포인터는 포인터 변수가 가리키는 메모리의 시작 주소를 기준으로 삼음
배열도 해당 배열이 사용하는 메모리 그룹의 시작 주소를 기준으로 삼는다.
*(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로 넘어가서 하겠습니당.
c언어 메모,정리 배열,포인터 -3일차 세 번째 (0) | 2022.12.07 |
---|---|
c언어 메모,정리 배열,포인터 -3일차 두번째 (0) | 2022.12.07 |
2일차 포인터 변수~c언어 (0) | 2022.12.06 |
2일차 c언어 typedef~ (0) | 2022.12.06 |
구초제 -c언어 2일차~ (0) | 2022.12.06 |