본문 바로가기
OS/Linux

[Linux/C] 배열은 포인터다!

by dev_Step 2022. 9. 13.

 

비교 조건 \    비교 대상 포인터 배열
이름 있음 있음
나타내는것 메모리 주소 메모리 주소
변수인가 상수인가 변수 상수

 * 배열 이름은 = 상수 포인터이다.

 

arr ==> 주소를 나타내고    해당 주소를 ptr에 넣어주므로

arr과 ptr은 같아진다. 주소를 나타내므로

포인터의 연산

해당 포인터의 선언된 타입에 따라 증감하면 해당 바이트 크기만큼 증감된다.

 

arr[ i ] == *(a+i) 으로 나타낼수있다.

 

 

문자열은  문자열 배열은 변수이고  ==>  char str1[5] = "abcd";  -> 변수  str1

문자열     문자는 상수이다               ==> char *str1 = "abcd";     -> 상수  *str1

 

또한 문자열 상수의 경우는 "두개의 문자열 상수가 완전히 똑같을 경우"

문자열은 한개의 메모리 공간에 저장되고, 두개의 변수는 한개의 메모리 주소를 가르킨다.

 

이러한 특징을 가지고 문자열 배열을 나타낼수 있다. 

=============================================================================

우선 배열을 선언하고 

array[3] = 0x55; 값을 대입하고

*(array+3) = 0x77; 값을 대입했다 

해당 내용을 gdb를 통해서 디버깅 해보자

해당 결과를 보면 

결국에 같은 주소에 0x55, 0x77이 대입된것을 확인 할 수 있는데 이것을 그림으로 나타내자면

 

이렇게 나타낼수 있고 실제로 주소값을 찍어보면 아래와 같다.

printf(" array %d", array);와

printf(" &array %d", &array); 동일하게 나타나며,

array[0] 값과 동일 하다 즉 array로 표현하면 해당 배열의 시작주소를 나타내는 것이다.

또한 해당배열이 array[0] -> array[1] --- 쭉 가면서 4씩 커지는 것을 확인 할 수 있다.

따라서 *(array+3)을 한다면 array[3]과 동일하게 표현할 수있다.

여기서 궁금증이 생기는데 해당 주소는 4씩 차이가 나는데 왜

+1, +2, +3 을해도 실제 메모리 주소에서는 4씩 차이가 나는걸까 동일하게 char 배열에서도 

*(array_c+2) *(array_c+3) *(array_c+4) 를 실시해도 해당 자료형의 크기만큼 증가되는것을 확인 할 수있따.

 

*(array+2) = 0x76

*(array+3) =  0x77  == array[3] = 0x77 동일  == array+3 의 값을 주소로 보고 해당 주소로 가서 값을 0x77로 바꿔라 

*(array+4) =  0x78

*(array_c+2) = 0x91

*(array_c+3) = 0x92

*(array_c+4) = 0x93

이것은 컴파일러가 내부적으로 해당 자료형에 맞게끔 메모리 주소를 저장시켜주는건데

포인터의 자료형을 선언해주는 이유가 된다. 

 

'OS > Linux' 카테고리의 다른 글

[C/Linux] 배열의 선언  (0) 2022.09.12
[C/Linux] static 변수  (0) 2022.09.10
[Linux/C] 파일 입출력1-1(표준입출력)  (0) 2022.05.25
[Linux/C] 파일 입-출력2  (0) 2022.05.25
[Linux/C] Makefile  (1) 2022.05.19